Core Java

Convert String to Date Using MapStruct in Java

MapStruct is a tool in Java that simplifies the process of object-to-object mapping. It is often used in applications to transfer data between layers or convert Data Transfer Objects (DTOs) into entities.

In Java applications, we often encounter scenarios where we need to map fields between objects, especially when converting data between different formats. One such scenario is when we have a String in one class (source) that we need to convert to a Date in another class (target). This article explains how to convert a String to a Date using MapStruct.

1. The Problem

We have a source class with a String field representing a date in the format "yyyy-MM-dd". Our target class needs this field to be mapped to a java.util.Date object.

1.1 Prerequisite

Be sure to add the following dependency to your pom.xml if you are using Maven, and also set up maven-compiler-plugin to include the MapStruct processor.

   <dependencies>
        <!-- MapStruct core library -->
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.5.5.Final</version> <!-- Check for the latest version -->
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.13.0</version> 
                <configuration>
                    <annotationProcessorPaths>
                        <path>
                            <!-- MapStruct Processor, which generates the code for mapping -->
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>1.5.5.Final</version> 
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>

This configuration enables Maven to use the MapStruct processor to automatically generate the mapper implementation code from our interfaces. Without this, the MapStruct annotations won’t be processed correctly, and the code for the mapping will not be generated. The version 1.5.5.Final must match the MapStruct core library’s version to ensure compatibility.

2. Define the Domain Model and DTO

We will define a PersonDto class with a String birth date, a Person class with a Date birth date, and create a PersonMapper interface that uses the @Mapping annotation to specify the date format for the conversion.

public class PersonDto {

    private String name;
    // Date in String format
    private String birthDate;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(String birthDate) {
        this.birthDate = birthDate;
    }
}

public class Person {

    private String name;
    private Date birthDate;

    // Getters and Setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }

}

3. Create the Mapper Interface

Next, we will create a mapper interface that uses MapStruct to define the mapping between UserDTO and User. We will use MapStruct’s @Mapper and @Mapping annotations to define the mapping logic. Specifically, we will define that the birthDate from PersonDto (which is a String) should be converted to a Date in Person using the specified format ("yyyy-MM-dd").

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

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

    @Mapping(source = "birthDate", target = "birthDate", dateFormat = "yyyy-MM-dd")
    Person toPerson(PersonDto personDto);

}

3.1 Using the Mapper

With our mapper now set up, let’s look at how we can use it in our application.

public class MapstructExample {

    public static void main(String[] args) {
        // Create a PersonDto object with a birthDate as String
        PersonDto personDto = new PersonDto();
        personDto.setName("John Fish");
        personDto.setBirthDate("1983-05-11");

        // Use the generated mapper to map PersonDto to Person
        Person person = PersonMapper.INSTANCE.toPerson(personDto);

        System.out.println("Name: " + person.getName());
        System.out.println("Birth Date: " + person.getBirthDate());

    }
}

Output

The above class outputs the following:

java mapstruct string to date example output

The Person object has the birthDate as a Date, which is printed in the default Date format (Wed May 11 00:00:00 WAT 1983).

4. Implementing Custom Mapping Logic

If we need more control over how data is converted, we can implement custom conversion methods.

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

    @Mapping(target = "birthDate", expression = "java(map(personDto.getBirthDate()))")
    Person toPerson(PersonDto personDto);
    
    default Date map(String value) {
        if (value == null || value.isEmpty()) {
            return null;
        }
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
            return sdf.parse(value);
        } catch (ParseException e) {
            throw new RuntimeException("Failed to parse date: " + value, e);
        }
    }

}

In this code snippet, the line @Mapping(target = "birthDate", expression = "java(map(personDto.getBirthDate()))") specifies how to map the birthDate property from the PersonDto to the Person object in the toPerson method. Instead of using a simple property mapping, this annotation employs a custom expression that invokes the map method to convert the String representation of the birth date from the PersonDto into a Date object for the Person.

5. Conclusion

In this article, we explored how to convert a String to a Date using MapStruct in Java. By defining the necessary classes and utilizing the @Mapping annotation, we demonstrated a straightforward approach to handle date conversions.

6. Download the Source Code

This was a guide on converting a String to Date using Java MapStruct.

Download
You can download the full source code of this example here: java mapstruct string to date

Omozegie Aziegbe

Omos Aziegbe is a technical writer and web/application developer with a BSc in Computer Science and Software Engineering from the University of Bedfordshire. Specializing in Java enterprise applications with the Jakarta EE framework, Omos also works with HTML5, CSS, and JavaScript for web development. As a freelance web developer, Omos combines technical expertise with research and writing on topics such as software engineering, programming, web application development, computer science, and technology.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Back to top button