Skip to content

Commit 336684d

Browse files
committed
Allow generic source and target types
1 parent 221fad9 commit 336684d

File tree

30 files changed

+712
-110
lines changed

30 files changed

+712
-110
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.mapstruct.extensions.spring.example.classname;
2+
3+
import org.mapstruct.Mapper;
4+
import org.mapstruct.extensions.spring.example.Wheel;
5+
import org.mapstruct.extensions.spring.example.WheelDto;
6+
import org.springframework.core.convert.converter.Converter;
7+
8+
@Mapper(config = MapperSpringConfig.class)
9+
public interface WheelMapper extends Converter<Wheel, WheelDto> {
10+
@Override
11+
WheelDto convert(Wheel source);
12+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.mapstruct.extensions.spring.example.classname;
2+
3+
import org.mapstruct.Mapper;
4+
import org.mapstruct.extensions.spring.example.WheelDto;
5+
import org.mapstruct.extensions.spring.example.Wheels;
6+
import org.springframework.core.convert.converter.Converter;
7+
8+
import java.util.List;
9+
10+
@Mapper(config = MapperSpringConfig.class)
11+
public interface WheelsDtoListMapper extends Converter<List<WheelDto>, Wheels> {
12+
@Override
13+
Wheels convert(List<WheelDto> source);
14+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.mapstruct.extensions.spring.example.classname;
2+
3+
import org.mapstruct.Mapper;
4+
import org.mapstruct.extensions.spring.example.Wheel;
5+
import org.mapstruct.extensions.spring.example.WheelDto;
6+
import org.mapstruct.extensions.spring.example.Wheels;
7+
import org.springframework.core.convert.converter.Converter;
8+
9+
import java.util.List;
10+
11+
@Mapper(config = MapperSpringConfig.class, imports = Wheel.class)
12+
public interface WheelsMapper extends Converter<Wheels, List<WheelDto>> {
13+
@Override
14+
List<WheelDto> convert(Wheels source);
15+
}
Lines changed: 60 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
11
package org.mapstruct.extensions.spring.example;
22

3-
import static org.assertj.core.api.BDDAssertions.then;
4-
import static org.mapstruct.extensions.spring.example.CarType.OTHER;
5-
import static org.mapstruct.extensions.spring.example.SeatMaterial.LEATHER;
6-
73
import org.junit.jupiter.api.BeforeEach;
84
import org.junit.jupiter.api.Test;
95
import org.junit.jupiter.api.extension.ExtendWith;
10-
import org.mapstruct.extensions.spring.example.classname.CarMapper;
11-
import org.mapstruct.extensions.spring.example.classname.SeatConfigurationMapper;
6+
import org.mapstruct.extensions.spring.example.classname.*;
127
import org.springframework.beans.factory.annotation.Autowired;
138
import org.springframework.context.annotation.Bean;
149
import org.springframework.context.annotation.ComponentScan;
@@ -18,17 +13,30 @@
1813
import org.springframework.test.context.ContextConfiguration;
1914
import org.springframework.test.context.junit.jupiter.SpringExtension;
2015

16+
import java.util.ArrayList;
17+
import java.util.List;
18+
19+
import static org.assertj.core.api.BDDAssertions.then;
20+
import static org.mapstruct.extensions.spring.example.CarType.OTHER;
21+
import static org.mapstruct.extensions.spring.example.SeatMaterial.LEATHER;
22+
import static org.mapstruct.extensions.spring.example.WheelPosition.RIGHT_FRONT;
23+
2124
@ExtendWith(SpringExtension.class)
2225
@ContextConfiguration(
2326
classes = {ConversionServiceAdapterIntegrationTest.AdditionalBeanConfiguration.class})
2427
public class ConversionServiceAdapterIntegrationTest {
2528
private static final String TEST_MAKE = "Volvo";
26-
private static final org.mapstruct.extensions.spring.example.CarType TEST_CAR_TYPE = OTHER;
27-
protected static final int TEST_NUMBER_OF_SEATS = 5;
28-
protected static final org.mapstruct.extensions.spring.example.SeatMaterial TEST_SEAT_MATERIAL = LEATHER;
29+
private static final CarType TEST_CAR_TYPE = OTHER;
30+
private static final int TEST_NUMBER_OF_SEATS = 5;
31+
private static final SeatMaterial TEST_SEAT_MATERIAL = LEATHER;
32+
private static final int TEST_DIAMETER = 20;
33+
private static final WheelPosition TEST_WHEEL_POSITION = RIGHT_FRONT;
2934

3035
@Autowired private CarMapper carMapper;
3136
@Autowired private SeatConfigurationMapper seatConfigurationMapper;
37+
@Autowired private WheelMapper wheelMapper;
38+
@Autowired private WheelsMapper wheelsMapper;
39+
@Autowired private WheelsDtoListMapper wheelsDtoListMapper;
3240
@Autowired private ConfigurableConversionService conversionService;
3341

3442
@ComponentScan("org.mapstruct.extensions.spring")
@@ -44,36 +52,72 @@ ConfigurableConversionService getConversionService() {
4452
void addMappersToConversionService() {
4553
conversionService.addConverter(carMapper);
4654
conversionService.addConverter(seatConfigurationMapper);
55+
conversionService.addConverter(wheelMapper);
56+
conversionService.addConverter(wheelsMapper);
57+
conversionService.addConverter(wheelsDtoListMapper);
4758
}
4859

4960
@Test
5061
void shouldKnowAllMappers() {
51-
then(conversionService.canConvert(org.mapstruct.extensions.spring.example.Car.class, org.mapstruct.extensions.spring.example.CarDto.class)).isTrue();
52-
then(conversionService.canConvert(org.mapstruct.extensions.spring.example.SeatConfiguration.class, org.mapstruct.extensions.spring.example.SeatConfigurationDto.class))
53-
.isTrue();
62+
then(conversionService.canConvert(Car.class, CarDto.class)).isTrue();
63+
then(conversionService.canConvert(SeatConfiguration.class, SeatConfigurationDto.class)).isTrue();
64+
then(conversionService.canConvert(Wheel.class, WheelDto.class)).isTrue();
65+
then(conversionService.canConvert(Wheels.class, List.class)).isTrue();
66+
then(conversionService.canConvert(List.class, Wheels.class)).isTrue();
5467
}
5568

5669
@Test
5770
void shouldMapAllAttributes() {
5871
// Given
59-
final org.mapstruct.extensions.spring.example.Car car = new org.mapstruct.extensions.spring.example.Car();
72+
final Car car = new Car();
6073
car.setMake(TEST_MAKE);
6174
car.setType(TEST_CAR_TYPE);
62-
final org.mapstruct.extensions.spring.example.SeatConfiguration seatConfiguration = new org.mapstruct.extensions.spring.example.SeatConfiguration();
75+
final SeatConfiguration seatConfiguration = new SeatConfiguration();
6376
seatConfiguration.setSeatMaterial(TEST_SEAT_MATERIAL);
6477
seatConfiguration.setNumberOfSeats(TEST_NUMBER_OF_SEATS);
6578
car.setSeatConfiguration(seatConfiguration);
79+
final Wheels wheels = new Wheels();
80+
final ArrayList<Wheel> wheelsList = new ArrayList<>();
81+
final Wheel wheel = new Wheel();
82+
wheel.setDiameter(TEST_DIAMETER);
83+
wheel.setPosition(TEST_WHEEL_POSITION);
84+
wheelsList.add(wheel);
85+
wheels.setWheelsList(wheelsList);
86+
car.setWheels(wheels);
6687

6788
// When
68-
final org.mapstruct.extensions.spring.example.CarDto mappedCar = conversionService.convert(car, org.mapstruct.extensions.spring.example.CarDto.class);
89+
final CarDto mappedCar = conversionService.convert(car, CarDto.class);
6990

7091
// Then
7192
then(mappedCar).isNotNull();
7293
then(mappedCar.getMake()).isEqualTo(TEST_MAKE);
7394
then(mappedCar.getType()).isEqualTo(String.valueOf(TEST_CAR_TYPE));
74-
final org.mapstruct.extensions.spring.example.SeatConfigurationDto mappedCarSeats = mappedCar.getSeats();
95+
final SeatConfigurationDto mappedCarSeats = mappedCar.getSeats();
7596
then(mappedCarSeats).isNotNull();
7697
then(mappedCarSeats.getSeatCount()).isEqualTo(TEST_NUMBER_OF_SEATS);
7798
then(mappedCarSeats.getMaterial()).isEqualTo(String.valueOf(TEST_SEAT_MATERIAL));
99+
final WheelDto expectedWheelDto = new WheelDto();
100+
expectedWheelDto.setPosition(String.valueOf(TEST_WHEEL_POSITION));
101+
expectedWheelDto.setDiameter(TEST_DIAMETER);
102+
then(mappedCar.getWheels()).hasSize(1).containsExactly(expectedWheelDto);
103+
}
104+
105+
@Test
106+
void shouldMapGenericSourceType() {
107+
// Given
108+
final WheelDto dto = new WheelDto();
109+
dto.setPosition(String.valueOf(TEST_WHEEL_POSITION));
110+
dto.setDiameter(TEST_DIAMETER);
111+
final List<WheelDto> dtoList = new ArrayList<>();
112+
dtoList.add(dto);
113+
114+
// When
115+
final Wheels convertedWheels = conversionService.convert(dtoList, Wheels.class);
116+
117+
// Then
118+
final Wheel expectedWheel = new Wheel();
119+
expectedWheel.setPosition(TEST_WHEEL_POSITION);
120+
expectedWheel.setDiameter(TEST_DIAMETER);
121+
then(convertedWheels).isNotNull().hasSize(1).containsExactly(expectedWheel);
78122
}
79123
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.mapstruct.extensions.spring.example.custombean;
2+
3+
import org.mapstruct.Mapper;
4+
import org.mapstruct.extensions.spring.example.Wheel;
5+
import org.mapstruct.extensions.spring.example.WheelDto;
6+
import org.springframework.core.convert.converter.Converter;
7+
8+
@Mapper(config = MapperSpringConfig.class)
9+
public interface WheelMapper extends Converter<Wheel, WheelDto> {
10+
@Override
11+
WheelDto convert(Wheel source);
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.mapstruct.extensions.spring.example.custombean;
2+
3+
import org.mapstruct.Mapper;
4+
import org.mapstruct.extensions.spring.example.WheelDto;
5+
import org.mapstruct.extensions.spring.example.Wheels;
6+
import org.springframework.core.convert.converter.Converter;
7+
8+
import java.util.List;
9+
10+
@Mapper(config = MapperSpringConfig.class)
11+
public interface WheelsDtoListMapper extends Converter<List<WheelDto>, Wheels> {
12+
@Override
13+
Wheels convert(List<WheelDto> source);
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.mapstruct.extensions.spring.example.custombean;
2+
3+
import org.mapstruct.Mapper;
4+
import org.mapstruct.extensions.spring.example.Wheel;
5+
import org.mapstruct.extensions.spring.example.WheelDto;
6+
import org.mapstruct.extensions.spring.example.Wheels;
7+
import org.springframework.core.convert.converter.Converter;
8+
9+
import java.util.List;
10+
11+
@Mapper(config = MapperSpringConfig.class, imports = Wheel.class)
12+
public interface WheelsMapper extends Converter<Wheels, List<WheelDto>> {
13+
@Override
14+
List<WheelDto> convert(Wheels source);
15+
}

examples/custom-conversion-service-bean/src/test/java/org/mapstruct/extensions/spring/example/ConversionServiceAdapterIntegrationTest.java

Lines changed: 58 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package org.mapstruct.extensions.spring.example;
22

3-
import static org.assertj.core.api.BDDAssertions.then;
4-
import static org.mapstruct.extensions.spring.example.CarType.OTHER;
5-
import static org.mapstruct.extensions.spring.example.SeatMaterial.LEATHER;
6-
73
import org.junit.jupiter.api.BeforeEach;
84
import org.junit.jupiter.api.Test;
95
import org.junit.jupiter.api.extension.ExtendWith;
6+
import org.mapstruct.extensions.spring.example.custombean.*;
107
import org.springframework.beans.factory.annotation.Autowired;
118
import org.springframework.beans.factory.annotation.Qualifier;
129
import org.springframework.context.annotation.Bean;
@@ -16,22 +13,35 @@
1613
import org.springframework.stereotype.Component;
1714
import org.springframework.test.context.ContextConfiguration;
1815
import org.springframework.test.context.junit.jupiter.SpringExtension;
19-
import org.mapstruct.extensions.spring.example.custombean.CarMapper;
20-
import org.mapstruct.extensions.spring.example.custombean.SeatConfigurationMapper;
16+
17+
import java.util.ArrayList;
18+
import java.util.List;
19+
20+
import static org.assertj.core.api.BDDAssertions.then;
21+
import static org.mapstruct.extensions.spring.example.CarType.OTHER;
22+
import static org.mapstruct.extensions.spring.example.SeatMaterial.LEATHER;
23+
import static org.mapstruct.extensions.spring.example.WheelPosition.RIGHT_FRONT;
2124

2225
@ExtendWith(SpringExtension.class)
2326
@ContextConfiguration(
2427
classes = {ConversionServiceAdapterIntegrationTest.AdditionalBeanConfiguration.class})
2528
public class ConversionServiceAdapterIntegrationTest {
2629
private static final String TEST_MAKE = "Volvo";
2730
private static final CarType TEST_CAR_TYPE = OTHER;
28-
protected static final int TEST_NUMBER_OF_SEATS = 5;
29-
protected static final SeatMaterial TEST_SEAT_MATERIAL = LEATHER;
31+
private static final int TEST_NUMBER_OF_SEATS = 5;
32+
private static final SeatMaterial TEST_SEAT_MATERIAL = LEATHER;
33+
private static final int TEST_DIAMETER = 20;
34+
private static final WheelPosition TEST_WHEEL_POSITION = RIGHT_FRONT;
3035

3136
@Autowired private CarMapper carMapper;
3237
@Autowired private SeatConfigurationMapper seatConfigurationMapper;
33-
@Autowired @Qualifier("myConversionService")
34-
private ConfigurableConversionService conversionService;
38+
@Autowired private WheelMapper wheelMapper;
39+
@Autowired private WheelsMapper wheelsMapper;
40+
@Autowired private WheelsDtoListMapper wheelsDtoListMapper;
41+
42+
@Autowired
43+
@Qualifier("myConversionService")
44+
private ConfigurableConversionService conversionService;
3545

3646
@ComponentScan("org.mapstruct.extensions.spring")
3747
@Component
@@ -51,13 +61,18 @@ ConfigurableConversionService myConversionService() {
5161
void addMappersToConversionService() {
5262
conversionService.addConverter(carMapper);
5363
conversionService.addConverter(seatConfigurationMapper);
64+
conversionService.addConverter(wheelMapper);
65+
conversionService.addConverter(wheelsMapper);
66+
conversionService.addConverter(wheelsDtoListMapper);
5467
}
5568

5669
@Test
5770
void shouldKnowAllMappers() {
5871
then(conversionService.canConvert(Car.class, CarDto.class)).isTrue();
59-
then(conversionService.canConvert(SeatConfiguration.class, SeatConfigurationDto.class))
60-
.isTrue();
72+
then(conversionService.canConvert(SeatConfiguration.class, SeatConfigurationDto.class)).isTrue();
73+
then(conversionService.canConvert(Wheel.class, WheelDto.class)).isTrue();
74+
then(conversionService.canConvert(Wheels.class, List.class)).isTrue();
75+
then(conversionService.canConvert(List.class, Wheels.class)).isTrue();
6176
}
6277

6378
@Test
@@ -70,6 +85,14 @@ void shouldMapAllAttributes() {
7085
seatConfiguration.setSeatMaterial(TEST_SEAT_MATERIAL);
7186
seatConfiguration.setNumberOfSeats(TEST_NUMBER_OF_SEATS);
7287
car.setSeatConfiguration(seatConfiguration);
88+
final Wheels wheels = new Wheels();
89+
final ArrayList<Wheel> wheelsList = new ArrayList<>();
90+
final Wheel wheel = new Wheel();
91+
wheel.setDiameter(TEST_DIAMETER);
92+
wheel.setPosition(TEST_WHEEL_POSITION);
93+
wheelsList.add(wheel);
94+
wheels.setWheelsList(wheelsList);
95+
car.setWheels(wheels);
7396

7497
// When
7598
final CarDto mappedCar = conversionService.convert(car, CarDto.class);
@@ -82,5 +105,28 @@ void shouldMapAllAttributes() {
82105
then(mappedCarSeats).isNotNull();
83106
then(mappedCarSeats.getSeatCount()).isEqualTo(TEST_NUMBER_OF_SEATS);
84107
then(mappedCarSeats.getMaterial()).isEqualTo(String.valueOf(TEST_SEAT_MATERIAL));
108+
final WheelDto expectedWheelDto = new WheelDto();
109+
expectedWheelDto.setPosition(String.valueOf(TEST_WHEEL_POSITION));
110+
expectedWheelDto.setDiameter(TEST_DIAMETER);
111+
then(mappedCar.getWheels()).hasSize(1).containsExactly(expectedWheelDto);
112+
}
113+
114+
@Test
115+
void shouldMapGenericSourceType() {
116+
// Given
117+
final WheelDto dto = new WheelDto();
118+
dto.setPosition(String.valueOf(TEST_WHEEL_POSITION));
119+
dto.setDiameter(TEST_DIAMETER);
120+
final List<WheelDto> dtoList = new ArrayList<>();
121+
dtoList.add(dto);
122+
123+
// When
124+
final Wheels convertedWheels = conversionService.convert(dtoList, Wheels.class);
125+
126+
// Then
127+
final Wheel expectedWheel = new Wheel();
128+
expectedWheel.setPosition(TEST_WHEEL_POSITION);
129+
expectedWheel.setDiameter(TEST_DIAMETER);
130+
then(convertedWheels).isNotNull().hasSize(1).containsExactly(expectedWheel);
85131
}
86132
}

examples/model/src/main/java/org/mapstruct/extensions/spring/example/Car.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ public class Car {
44
private String make;
55
private SeatConfiguration seatConfiguration;
66
private CarType type;
7+
private Wheels wheels;
78

89
public String getMake() {
910
return make;
@@ -28,4 +29,12 @@ public CarType getType() {
2829
public void setType(final CarType type) {
2930
this.type = type;
3031
}
32+
33+
public Wheels getWheels() {
34+
return wheels;
35+
}
36+
37+
public void setWheels(Wheels wheels) {
38+
this.wheels = wheels;
39+
}
3140
}

examples/model/src/main/java/org/mapstruct/extensions/spring/example/CarDto.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package org.mapstruct.extensions.spring.example;
22

3+
import java.util.List;
4+
35
public class CarDto {
46
private String make;
57
private SeatConfigurationDto seats;
68
private String type;
9+
private List<WheelDto> wheels;
710

811
public String getMake() {
912
return make;
@@ -28,4 +31,12 @@ public String getType() {
2831
public void setType(final String type) {
2932
this.type = type;
3033
}
34+
35+
public List<WheelDto> getWheels() {
36+
return wheels;
37+
}
38+
39+
public void setWheels(List<WheelDto> wheels) {
40+
this.wheels = wheels;
41+
}
3142
}

0 commit comments

Comments
 (0)