eBook – Guide Spring Cloud – NPI EA (cat=Spring Cloud)
announcement - icon

Let's get started with a Microservice Architecture with Spring Cloud:

>> Join Pro and download the eBook

eBook – Mockito – NPI EA (tag = Mockito)
announcement - icon

Mocking is an essential part of unit testing, and the Mockito library makes it easy to write clean and intuitive unit tests for your Java code.

Get started with mocking and improve your application tests using our Mockito guide:

Download the eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications with our Java Concurrency guide:

>> Download the eBook

eBook – Reactive – NPI EA (cat=Reactive)
announcement - icon

Spring 5 added support for reactive programming with the Spring WebFlux module, which has been improved upon ever since. Get started with the Reactor project basics and reactive programming in Spring Boot:

>> Join Pro and download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Jackson – NPI EA (cat=Jackson)
announcement - icon

Do JSON right with Jackson

Download the E-book

eBook – HTTP Client – NPI EA (cat=Http Client-Side)
announcement - icon

Get the most out of the Apache HTTP Client

Download the E-book

eBook – Maven – NPI EA (cat = Maven)
announcement - icon

Get Started with Apache Maven:

Download the E-book

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

eBook – RwS – NPI EA (cat=Spring MVC)
announcement - icon

Building a REST API with Spring?

Download the E-book

Course – LS – NPI EA (cat=Jackson)
announcement - icon

Get started with Spring and Spring Boot, through the Learn Spring course:

>> LEARN SPRING
Course – RWSB – NPI EA (cat=REST)
announcement - icon

Explore Spring Boot 3 and Spring 6 in-depth through building a full REST API with the framework:

>> The New “REST With Spring Boot”

Course – LSS – NPI EA (cat=Spring Security)
announcement - icon

Yes, Spring Security can be complex, from the more advanced functionality within the Core to the deep OAuth support in the framework.

I built the security material as two full courses - Core and OAuth, to get practical with these more complex scenarios. We explore when and how to use each feature and code through it on the backing project.

You can explore the course here:

>> Learn Spring Security

Course – LSD – NPI EA (tag=Spring Data JPA)
announcement - icon

Spring Data JPA is a great way to handle the complexity of JPA with the powerful simplicity of Spring Boot.

Get started with Spring Data JPA through the guided reference course:

>> CHECK OUT THE COURSE

Partner – Moderne – NPI EA (cat=Spring Boot)
announcement - icon

Refactor Java code safely — and automatically — with OpenRewrite.

Refactoring big codebases by hand is slow, risky, and easy to put off. That’s where OpenRewrite comes in. The open-source framework for large-scale, automated code transformations helps teams modernize safely and consistently.

Each month, the creators and maintainers of OpenRewrite at Moderne run live, hands-on training sessions — one for newcomers and one for experienced users. You’ll see how recipes work, how to apply them across projects, and how to modernize code with confidence.

Join the next session, bring your questions, and learn how to automate the kind of work that usually eats your sprint time.

Course – LJB – NPI EA (cat = Core Java)
announcement - icon

Code your way through and build up a solid, practical foundation of Java:

>> Learn Java Basics

Partner – LambdaTest – NPI EA (cat= Testing)
announcement - icon

Distributed systems often come with complex challenges such as service-to-service communication, state management, asynchronous messaging, security, and more.

Dapr (Distributed Application Runtime) provides a set of APIs and building blocks to address these challenges, abstracting away infrastructure so we can focus on business logic.

In this tutorial, we'll focus on Dapr's pub/sub API for message brokering. Using its Spring Boot integration, we'll simplify the creation of a loosely coupled, portable, and easily testable pub/sub messaging system:

>> Flexible Pub/Sub Messaging With Spring Boot and Dapr

1. Introduction

Bean creation is a core part of how Spring initializes application components. However, when using the @Mapper annotation from MapStruct, we might encounter unexpected bean creation errors during application startup. These issues are typically triggered when Spring doesn’t correctly detect, instantiate, or wire MapStruct-generated mapper implementations. As a result, the application may fail to start, or various runtime exceptions may be raised, indicating that missing or improperly configured mapper beans are present.

In this tutorial, we’ll explore how to effectively resolve issues when creating beans, caused by the @Mapper annotation of MapStruct in Spring applications. Specifically, the focus will be on configuring mappers so that Spring properly detects, instantiates, and wires them, ensuring smooth application startup. Along the way, practical solutions and best practices will demonstrate how to prevent common runtime exceptions, enhance maintainability, and fully leverage the compile-time mapping capabilities of MapStruct.

2. How MapStruct Interacts With Spring Beans

Before we address the issues, it’s essential to understand how MapStruct operates and why Spring sometimes fails to recognize its generated mappers.

2.1. How MapStruct Generates Mappers

MapStruct acts as a compile-time annotation processor that transforms mapping interfaces into concrete implementations.

To illustrate this, consider a simple domain consisting of a Person entity and its corresponding PersonDto class:

public class Person {
    private String name;
    private int age;

    // Constructors, getters, and setters
}

public class PersonDto {
    private String name;
    private int age;

    // Constructors, getters, and setters
}

A mapper interface defines the transformation between these two types:

@Mapper
public interface PersonMapper {
    PersonDto toDto(Person person);
}

During compilation, MapStruct creates a class named PersonMapperImpl inside the generated sources directory. This generated class contains the actual field-mapping logic required to convert a Person entity into a PersonDto object. However, despite being available in the generated sources, the implementation remains a plain Java class without any Spring-specific annotations. Consequently, Spring doesn’t include the mapper in its application context and doesn’t manage its lifecycle.

2.2. Why Bean Creation Fails

The Spring dependency injection mechanism expects all required beans to be registered within the application context.

Let’s consider a service that declares a dependency on the mapper:

@Autowired
private PersonMapper personMapper;

When Spring attempts to inject this dependency, it triggers a NoSuchBeanDefinitionException. This happens because MapStruct doesn’t register the generated mapper implementations as Spring beans by default. Since the generated PersonMapperImpl lacks a Spring-specific annotation, the Spring container doesn’t detect it during component scanning.

There are several consequences of this:

  • Spring cannot locate the mapper implementation.
  • Dependency injection fails.
  • Application startup may break with missing-bean errors.

This challenge highlights the need to align the generated MapStruct code with the lifecycle of a Spring bean.

3. Configuring MapStruct Mappers for Spring

To fix the bean creation error discussed in the previous section, MapStruct must be configured to produce mapper implementations that Spring recognizes as managed beans.

3.1. Enabling the Spring Component Model

MapStruct generates Springmanaged mapper beans by specifying componentModel = “spring” in the @Mapper annotation:

@Mapper(componentModel = "spring")
public interface PersonMapper {
    PersonDto toDto(Person person);
}

With this configuration, MapStruct generates the implementation that we need:

@Component
public class PersonMapperImpl implements PersonMapper { ... }

In this case, the @Component annotation registers the generated mapper so that Spring treats it as a managed bean. As a result, it becomes part of the application context, making it available for injection into dependent services or controllers. This configuration bridges the MapStruct compile-time implementation with the Spring runtime dependency management, eliminating missing-bean errors and ensuring consistent mapper availability across the application.

3.2. Ensuring Annotation Processing Is Enabled

Even with the correct component model, MapStruct cannot generate mapper implementations without annotation processing. Annotation processors execute during compilation to produce the required classes. Without this configuration, the interfaces compile successfully, but the implementations don’t exist, preventing Spring from registering the beans.

Projects using Maven typically rely on the maven-compiler-plugin to execute the MapStruct annotation processor:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.10.1</version>
    <configuration>
        <annotationProcessorPaths>
            <path>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>${mapstruct.version}</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>

This configuration ensures that MapStruct generates all mapper implementations during the compile phase.

For Gradle-based projects, annotation processing depends on another setup (depending on the version):

dependencies {
    annotationProcessor 'org.mapstruct:mapstruct-processor:${mapstruct.version}'
}

Adding this dependency enables Gradle to execute the MapStruct code generator during compilation, producing mapper implementations that Spring detects and registers as managed beans.

4. Common Bean Creation Issues and Their Solutions

Even after configuring MapStruct and enabling annotation processing, certain bean-creation issues may persist in Spring applications. The following subsections outline the most common causes and their corresponding solutions.

4.1. Package Not Scanned by Spring

Spring Boot automatically scans packages under the package of the main application class. If the mappers are located outside this path, Spring doesn’t detect them, resulting in a NoSuchBeanDefinitionException when trying to inject the mapper.

To fix this, we can ensure that all mapper interfaces are placed within a package scanned by Spring, or explicitly define the packages to scan:

@SpringBootApplication(scanBasePackages = "com.example")

This way, we enable Spring to detect and register MapStruct mappers as beans correctly.

4.2. Conflicts Between Lombok and MapStruct

Projects that combine Lombok and MapStruct often encounter subtle compilation issues, leading to bean creation failures. Since both Lombok and MapStruct rely on annotation processors, any conflict or incorrect processor order may lead to different issues:

  • incomplete model classes
  • missing getters or setters
  • incorrect mapping behavior

Hence, let’s configure the Lombok annotation processor to execute before MapStruct:

<annotationProcessorPaths>
    <path>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </path>
    <path>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
    </path>
</annotationProcessorPaths>

When using Maven, this adjustment should ensure that all model classes are fully generated before MapStruct creates the mapper implementations, eliminating common bean injection issues in Spring applications.

4.3. IDE Annotation Processing Issues

IDE-level annotation processing often prevents MapStruct from generating mapper implementations, even when Maven or Gradle is configured correctly. Many IDEs disable it by default. This situation results in missing *MapperImpl files, bean creation failures, and compilation errors in the IDE.

To resolve such problems, we enable annotation processing in the IDE settings so that MapStruct can automatically generate the required mapper implementations.

5. Conclusion

In this article, we examined how the MapStruct @Mapper annotation interacts with the Spring bean creation process and why mapper implementations sometimes fail to load correctly during application startup. MapStruct generates mapper implementations at compile time, and if Spring doesn’t detect them correctly, a bean error occurs. By configuring the @Mapper annotation with component model and ensuring annotation processing is active in both build tools and IDEs, the generated mappers integrate seamlessly into the Spring application context.

Furthermore, resolving common issues such as mappers placed outside scanned packages, conflicts with Lombok, and annotation processing problems in the IDE stabilizes the mapping layer and avoids runtime bean errors. As a result, proper configuration and build setup, aligned with Spring scanning and injection mechanisms, guarantee the reliable availability of mapper beans.

The source code is available over on GitHub.

Baeldung Pro – NPI EA (cat = Baeldung)
announcement - icon

Baeldung Pro comes with both absolutely No-Ads as well as finally with Dark Mode, for a clean learning experience:

>> Explore a clean Baeldung

Once the early-adopter seats are all used, the price will go up and stay at $33/year.

eBook – HTTP Client – NPI EA (cat=HTTP Client-Side)
announcement - icon

The Apache HTTP Client is a very robust library, suitable for both simple and advanced use cases when testing HTTP endpoints. Check out our guide covering basic request and response handling, as well as security, cookies, timeouts, and more:

>> Download the eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications with our Java Concurrency guide:

>> Download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

Course – LS – NPI EA (cat=REST)

announcement - icon

Get started with Spring Boot and with core Spring, through the Learn Spring course:

>> CHECK OUT THE COURSE

Partner – Moderne – NPI EA (tag=Refactoring)
announcement - icon

Modern Java teams move fast — but codebases don’t always keep up. Frameworks change, dependencies drift, and tech debt builds until it starts to drag on delivery. OpenRewrite was built to fix that: an open-source refactoring engine that automates repetitive code changes while keeping developer intent intact.

The monthly training series, led by the creators and maintainers of OpenRewrite at Moderne, walks through real-world migrations and modernization patterns. Whether you’re new to recipes or ready to write your own, you’ll learn practical ways to refactor safely and at scale.

If you’ve ever wished refactoring felt as natural — and as fast — as writing code, this is a good place to start.

eBook Jackson – NPI EA – 3 (cat = Jackson)