Course – Black Friday 2025 – NPI EA (cat= Baeldung)
announcement - icon

Yes, we're now running our Black Friday Sale. All Access and Pro are 33% off until 2nd December, 2025:

>> EXPLORE ACCESS NOW

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

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

Partner – Orkes – NPI EA (tag=Microservices)
announcement - icon

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

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 – 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

Partner – Orkes – NPI EA (cat=Java)
announcement - icon

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

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 – Black Friday 2025 – NPI (cat=Baeldung)
announcement - icon

Yes, we're now running our Black Friday Sale. All Access and Pro are 33% off until 2nd December, 2025:

>> EXPLORE ACCESS NOW

1. Overview

In this tutorial, we’ll look at how to customize our MapStruct mappers to convert empty Strings into nulls. We’ll investigate several options, each offering varying levels of control and customization.

2. Example Objects

Before we start, we need to create two objects to map between in our examples and tests. To keep things simple, we’ll use a Student as our object to map from:

class Student {
    String firstName;
    String lastName;
}

For our object to map into, let’s create a Teacher:

class Teacher {
    String firstName;
    String lastName;
}

We’ve kept things very basic here; both classes have the same properties with the same names, so by default, our mappers will work without extra annotations.

3. Global Mapper for All Strings

For our first mapper, let’s look at a solution that will cover every situation and every mapping we create. This is useful if our application always wants to convert Strings to nulls, without exception.

The basic outline of a mapper will be the same for all examples. We need an interface annotated with @Mapper, an instance of the interface so we can make use of it, and finally, our mapper method:

@Mapper
interface EmptyStringToNullGlobal {
    EmptyStringToNullGlobal INSTANCE = Mappers.getMapper(EmptyStringToNullGlobal.class);

    Teacher toTeacher(Student student);
}

This will already work for basic mapping. However, if we want it to convert empty Strings to nulls, we’ll need to add another mapper to the Interface:

String mapEmptyString(String string) {
    return string != null && !string.isEmpty() ? string : null;
}

In this method, we’re telling MapStruct to return null if the String it’s dealing with is either already null or empty. Otherwise, it returns the original String.

MapStruct will use this method for all Strings it comes across, so if we added more mappers to our interface, they’d automatically use it as well. As long as we always want this behavior, this option is simple, automatically reusable, and requires minimal extra code. It’s also a versatile solution, as it would allow us to do many more things than the conversion we are focusing on here.

To demonstrate this working, let’s create a simple test:

@Test
void givenAMapperWithGlobalNullHandling_whenConvertingEmptyString_thenOutputNull() {
    EmptyStringToNullGlobal globalMapper = EmptyStringToNullGlobal.INSTANCE;

    Student student = new Student("Steve", "");

    Teacher teacher = globalMapper.toTeacher(student);
    assertEquals("Steve", teacher.firstName);
    assertNull(teacher.lastName);
}

In this test, we’ve retrieved an instance of our mapper. Then, we’ve created a Student with the first name Steve and an empty String for their second name. After using our mapper, we can see that the created Teacher object has the first name Steve as expected. It also has a null second name, proving the mapper works as we wanted.

4. Using the @Condition Annotation

4.1. Basic @Condition Usage

The second option we’ll look at uses the @Condition annotation. This annotation allows us to create methods that MapStruct will call to check if a property should be mapped or not. As MapStruct will default non-mapped fields to null, we can use this to achieve our goal. This time, our mapper interface looks the same as before, but with a new method replacing our previous String mapper:

@Mapper
interface EmptyStringToNullCondition {
    EmptyStringToNullCondition INSTANCE = Mappers.getMapper(EmptyStringToNullCondition.class);

    Teacher toTeacher(Student student);

    @Condition
    default boolean isNotEmpty(String value) {
        return value != null && !value.isEmpty();
    }
}

Our method isNotEmpty() here will be called by MapStruct every time it comes across a String to process. If it returns false, it won’t map the value, and the field in the target object will be null. If it returns true, on the other hand, the value will be mapped across.

Let’s create a test to confirm this works as expected:

@Test
void givenAMapperWithConditionAnnotationNullHandling_whenConvertingEmptyString_thenOutputNull() {
    EmptyStringToNullCondition conditionMapper = EmptyStringToNullCondition.INSTANCE;

    Student student = new Student("Steve", "");

    Teacher teacher = conditionMapper.toTeacher(student);
    assertEquals("Steve", teacher.firstName);
    assertNull(teacher.lastName);
}

The test is almost identical to the one we wrote for the last option we looked at. We are simply using the new mapper and checking that we get the same results.

4.2. Checking Target and Source Property Names

The @Condition annotation option is more customizable than our previous global mapper example. We can add two extra annotated arguments, targetPropertyName and sourcePropertyName, to our isNotEmpty() method signature:

@Condition
boolean isNotEmpty(String value, @TargetPropertyName String targetPropertyName, @SourcePropertyName String sourcePropertyName) {
    if (sourcePropertyName.equals("lastName")) {
        return value != null && !value.isEmpty();
    }
    return true;
}

These new arguments give us the field names we are mapping to and from. We can use them to give special treatment to some Strings, and perhaps exclude others from our checks entirely. In this example, we’ve specifically looked for a source property called lastName and only applied our checks when we find it. This option is useful if we want to apply the empty String to null mapping for most cases and have a few exceptions, or we only rarely want to apply it. 

If there are a lot of exceptions or fields we want to look for, the code would get too messy, and we should look at another way of doing this. This option is also limited to the field in the created object being null or the source value; we can’t alter the value at all.

5. Using an Expression

Finally, let’s look at the most targeted option. We can use an expression in our mapper to affect a single mapping method at a time. So, this approach is optimal if this is not a behavior we want to use widely. To use an expression, we simply add it to the @Mapping annotation on our method. Our mapper interface will look like:

@Mapper
public interface EmptyStringToNullExpression {
    EmptyStringToNullExpression INSTANCE = Mappers.getMapper(EmptyStringToNullExpression.class);

    @Mapping(target = "lastName", expression = "java(student.lastName.isEmpty() ? null : student.lastName)")
    Teacher toTeacher(Student student);
}

This option gives us a lot of power. We’ve defined the target field we are interested in and provided Java code to tell MapStruct how to map it across. Our Java checks if the lastName field is empty; if so, it returns null, else it returns the original lastName.

The benefit and the drawback here are that we’ve been very specific about what field this will affect. The firstName field will not be handled at all, let alone any Strings in other mappers we might define. This is, therefore, an ideal option for applications where we only very rarely want to map our Strings like this.

Finally, let’s test the expression-based option and confirm it works:

@Test
void givenAMapperUsingExpressionBasedNullHandling_whenConvertingEmptyString_thenOutputNull() {
    EmptyStringToNullExpression expressionMapper = EmptyStringToNullExpression.INSTANCE;

    Student student = new Student("Steve", "");

    Teacher teacher = expressionMapper.toTeacher(student);
    assertEquals("Steve", teacher.firstName);
    assertNull(teacher.lastName);
}

Again, we’ve tested the same thing, just using our expression mapper. Once again, the lastName field is mapped to null as expected, while firstName remains intact.

6. Conclusion

In this article, we’ve looked at three options for using MapStruct to convert Strings to nulls. First, we saw that using a global mapper is a simple option if we always want this behavior without exception. We then looked at using the @Condition annotation to get similar results, but with the option for more control if we need it. Finally, we saw how we can use an expression to target individual fields if we only rarely want a certain mapping to occur.

The code backing this article is available on GitHub. Once you're logged in as a Baeldung Pro Member, start learning and coding on the project.
Course – Black Friday 2025 – NPI EA (cat= Baeldung)
announcement - icon

Yes, we're now running our Black Friday Sale. All Access and Pro are 33% off until 2nd December, 2025:

>> EXPLORE ACCESS NOW

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

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

Partner – Orkes – NPI EA (tag = Microservices)
announcement - icon

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

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.

Course – Black Friday 2025 – NPI (All)
announcement - icon

Yes, we're now running our Black Friday Sale. All Access and Pro are 33% off until 2nd December, 2025:

>> EXPLORE ACCESS NOW

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