这是indexloc提供的服务,不要输入任何密码
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion mapstruct-2/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,15 @@
<version>${lombok.mapstruct.binding.version}</version>
</path>
</annotationProcessorPaths>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>

<properties>
<org.mapstruct.version>1.6.0.Beta2</org.mapstruct.version>
<org.mapstruct.version>1.6.3</org.mapstruct.version>
<lombok.mapstruct.binding.version>0.2.0</lombok.mapstruct.binding.version>
</properties>

Expand Down
28 changes: 28 additions & 0 deletions mapstruct-2/src/main/java/com/baeldung/list/CarMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.baeldung.list;

import java.util.Arrays;

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

import com.baeldung.list.entity.Car;
import com.baeldung.list.entity.CarDto;
import com.baeldung.list.entity.ManufacturingPlantDto;

@Mapper(imports = { Arrays.class, ManufacturingPlantDto.class })
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);

@Mapping(target = "numberOfSeats", source = "seats")
@Mapping(
target = "manufacturingPlantDtos",
expression = """
java(Arrays.asList(
new ManufacturingPlantDto(car.getPlant1(), car.getPlant1Loc()),
new ManufacturingPlantDto(car.getPlant2(), car.getPlant2Loc())
))
"""
)
CarDto carToCarDto(Car car);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.baeldung.list;

import java.util.Arrays;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.baeldung.list.entity.Car;
import com.baeldung.list.entity.CarDto;
import com.baeldung.list.entity.ManufacturingPlantDto;

public abstract class CarMapperDecorator implements CustomCarMapper {
private final Logger logger = LoggerFactory.getLogger(CarMapperDecorator.class);
private CustomCarMapper delegate;

public CarMapperDecorator(CustomCarMapper delegate) {
this.delegate = delegate;
}

@Override
public CarDto carToCarDto(Car car) {
logger.info("calling Mapper decorator");
CarDto carDto = delegate.carToCarDto(car);

carDto.setManufacturingPlantDtos(getManufacturingPlantDtos(car));

return carDto;
}

private List<ManufacturingPlantDto> getManufacturingPlantDtos(Car car) {
// some custom logic or transformation which may require calls to other services
return Arrays.asList(
new ManufacturingPlantDto(car.getPlant1(), car.getPlant1Loc()),
new ManufacturingPlantDto(car.getPlant2(), car.getPlant2Loc())
);
}
}
18 changes: 18 additions & 0 deletions mapstruct-2/src/main/java/com/baeldung/list/CustomCarMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.baeldung.list;

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

import com.baeldung.list.entity.Car;
import com.baeldung.list.entity.CarDto;

@Mapper
@DecoratedWith(CarMapperDecorator.class)
public interface CustomCarMapper {
CustomCarMapper INSTANCE = Mappers.getMapper(CustomCarMapper.class);

@Mapping(source = "seats", target = "numberOfSeats")
CarDto carToCarDto(Car car);
}
72 changes: 72 additions & 0 deletions mapstruct-2/src/main/java/com/baeldung/list/entity/Car.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.baeldung.list.entity;

public class Car {
private String make;
private String model;
private int year;
private int seats;

private String plant1;
private String plant1Loc;
private String plant2;
private String plant2Loc;

public Car(String make, String model, int year, int seats) {
this.make = make;
this.model = model;
this.year = year;
this.seats = seats;
}

public String getPlant2() {
return plant2;
}

public void setPlant2(String plant2) {
this.plant2 = plant2;
}

public String getPlant2Loc() {
return plant2Loc;
}

public void setPlant2Loc(String plant2Loc) {
this.plant2Loc = plant2Loc;
}

public String getPlant1Loc() {
return plant1Loc;
}

public void setPlant1Loc(String plant1Loc) {
this.plant1Loc = plant1Loc;
}

public String getPlant1() {
return plant1;
}

public void setPlant1(String plant1) {
this.plant1 = plant1;
}

public int getSeats() {
return seats;
}

public void setSeats(int seats) {
this.seats = seats;
}

public String getMake() {
return make;
}

public String getModel() {
return model;
}

public int getYear() {
return year;
}
}
60 changes: 60 additions & 0 deletions mapstruct-2/src/main/java/com/baeldung/list/entity/CarDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.baeldung.list.entity;

import java.util.List;

public class CarDto {
private String make;
private String model;
private int year;
private int numberOfSeats;

private List<ManufacturingPlantDto> manufacturingPlantDtos;

public CarDto(String make, String model, int year, int numberOfSeats) {
this.make = make;
this.model = model;
this.year = year;
this.numberOfSeats = numberOfSeats;
}

public void setMake(String make) {
this.make = make;
}

public void setModel(String model) {
this.model = model;
}

public void setYear(int year) {
this.year = year;
}

public List<ManufacturingPlantDto> getManufacturingPlantDtos() {
return manufacturingPlantDtos;
}

public void setManufacturingPlantDtos(List<ManufacturingPlantDto> manufacturingPlantDtos) {
this.manufacturingPlantDtos = manufacturingPlantDtos;
}


public int getNumberOfSeats() {
return numberOfSeats;
}

public void setNumberOfSeats(int numberOfSeats) {
this.numberOfSeats = numberOfSeats;
}

public String getMake() {
return make;
}

public String getModel() {
return model;
}

public int getYear() {
return year;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.baeldung.list.entity;

public class ManufacturingPlantDto {
private String plantName;
private String location;

public ManufacturingPlantDto(String plantName, String location) {
this.plantName = plantName;
this.location = location;
}

public String getPlantName() {
return plantName;
}

public void setPlantName(String plantName) {
this.plantName = plantName;
}

public String getLocation() {
return location;
}

public void setLocation(String location) {
this.location = location;
}
}
69 changes: 69 additions & 0 deletions mapstruct-2/src/main/resources/puml/object_to_list_cld.puml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
@startuml
'https://plantuml.com/class-diagram
hide empty attributes
skinparam Handwritten false
skinparam ClassBorderColor black
skinparam BackgroundColor #fffce8/#f8f9fa
skinparam class {
ArrowColor SeaGreen
BackgroundColor #fffce8
}

class Car {
-make: String
-model: String
-year: int
-seats: int
-plant1: String
-plant2: String
-plant1Loc: String
-plant2Loc: String
__
+Car(make: String, model: String, year: int, seats: int)
__
<i>Standard getter and setter methods
}

class CarDto {
-make: String
-model: String
-year: int
-numberOfseats: int
-manufacturingPlantDtos:List<ManufacturingPlantDto>
__
+CarDto(make: String, model: String, year: int, numberOfSeats: int)
__
<i>Standard getter and setter methods
}



class ManufacturingPlantDto {
-plantName: String
-location: String
__
+ManufacturingPlantDto(plantName: String, location: String)
__
<i>Standard getter and setter methods
}

note left of Car
Source object
end note

note left of CarDto
Target object derived from Car
end note

note left of ManufacturingPlantDto::plantName
possible values mapped to
Car#plant1 and Car#plant2
end note
note left of ManufacturingPlantDto::location
possible values mapped to
Car#plant1Loc and Car#plant2Loc
end note

CarDto -down-> ManufacturingPlantDto: 1\n*
Car .down. CarDto: 1\n1
@enduml
Loading