Skip to content

Commit c113a55

Browse files
authored
Merge pull request #27 from mapstruct/issue21-implicit-cyclical-dependency
Issue21 implicit cyclical dependency
2 parents 993b6dd + 14cc702 commit c113a55

File tree

20 files changed

+238
-3
lines changed

20 files changed

+238
-3
lines changed

annotations/src/main/java/org/mapstruct/extensions/spring/SpringMapperConfig.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,12 @@
3737
* @return The bean name for the Spring {@link org.springframework.core.convert.ConversionService}.
3838
*/
3939
String conversionServiceBeanName() default "";
40+
41+
/**
42+
* To set if the Lazy annotation will be added to the
43+
* ConversionService's usage in the ConversionServiceAdapter. Defaults to true.
44+
*
45+
* @return true to add the Lazy annotation
46+
*/
47+
boolean lazyAnnotatedConversionServiceBean() default true;
4048
}

docs/src/docs/asciidoc/chapter-3-mapper-as-converter.asciidoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ The generated Adapter class will look like this:
5555
public class ConversionServiceAdapter {
5656
private final ConversionService conversionService;
5757
58-
public ConversionServiceAdapter(final ConversionService conversionService) {
58+
public ConversionServiceAdapter(@Lazy final ConversionService conversionService) {
5959
this.conversionService = conversionService;
6060
}
6161
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
plugins {
2+
id "org.springframework.boot" version "2.4.4"
3+
id "io.spring.dependency-management" version "1.0.11.RELEASE"
4+
}
5+
6+
dependencies {
7+
annotationProcessor project(":extensions")
8+
implementation project(":examples:model")
9+
implementation project(":annotations")
10+
11+
implementation 'org.mapstruct:mapstruct:1.4.0.Final'
12+
annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.0.Final'
13+
implementation 'org.springframework.boot:spring-boot-starter'
14+
testImplementation 'org.springframework.boot:spring-boot-starter-test:2.4.4'
15+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package org.mapstruct.extensions.spring.example.boot;
2+
3+
import org.mapstruct.extensions.spring.example.Car;
4+
import org.mapstruct.extensions.spring.example.CarDto;
5+
import org.mapstruct.extensions.spring.example.SeatConfiguration;
6+
import org.mapstruct.extensions.spring.example.SeatMaterial;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
import org.springframework.boot.CommandLineRunner;
10+
import org.springframework.boot.SpringApplication;
11+
import org.springframework.boot.autoconfigure.SpringBootApplication;
12+
import org.springframework.context.ApplicationContext;
13+
import org.springframework.context.annotation.Bean;
14+
15+
@SpringBootApplication
16+
public class Start {
17+
public static void main(String[] args) {
18+
SpringApplication.run(Start.class, args);
19+
}
20+
21+
private static final Logger log = LoggerFactory.getLogger(Start.class);
22+
23+
@Bean
24+
public CommandLineRunner commandLineRunner(ApplicationContext ctx, ConversionServiceAdapter adapter) {
25+
return args -> {
26+
final SeatConfiguration seatConf = new SeatConfiguration();
27+
seatConf.setSeatMaterial(SeatMaterial.FABRIC);
28+
final Car car = new Car();
29+
car.setMake("make");
30+
car.setSeatConfiguration(seatConf);
31+
32+
log.info("map start");
33+
final CarDto carDto = adapter.mapCarToCarDto(car);
34+
log.info(carDto.toString());
35+
};
36+
}
37+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.mapstruct.extensions.spring.example.boot.config;
2+
3+
import org.slf4j.LoggerFactory;
4+
import org.springframework.beans.factory.ListableBeanFactory;
5+
import org.springframework.boot.convert.ApplicationConversionService;
6+
import org.springframework.context.annotation.Bean;
7+
import org.springframework.context.annotation.Configuration;
8+
import org.springframework.core.convert.ConversionService;
9+
import org.springframework.core.convert.converter.Converter;
10+
import org.springframework.format.support.DefaultFormattingConversionService;
11+
import org.springframework.format.support.FormattingConversionService;
12+
13+
@Configuration
14+
public class ConverterConfig {
15+
private final ListableBeanFactory beanFactory;
16+
17+
public ConverterConfig(ListableBeanFactory beanFactory) {
18+
this.beanFactory = beanFactory;
19+
}
20+
21+
/**
22+
* without spring-boot-starter-web, no custom mappers will be added automatically;
23+
* register manually we register manually all our {@link Converter}
24+
*/
25+
@Bean
26+
public ConversionService conversionService() {
27+
LoggerFactory.getLogger(ConverterConfig.class).info("ConversionService bean init");
28+
final FormattingConversionService service = new DefaultFormattingConversionService();
29+
ApplicationConversionService.addBeans(service, this.beanFactory);
30+
return service;
31+
}
32+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.mapstruct.extensions.spring.example.boot.mappers;
2+
3+
import org.mapstruct.Mapper;
4+
import org.mapstruct.Mapping;
5+
import org.mapstruct.extensions.spring.example.Car;
6+
import org.mapstruct.extensions.spring.example.CarDto;
7+
import org.springframework.core.convert.converter.Converter;
8+
9+
@Mapper(config = MapperSpringConfig.class)
10+
public interface CarMapper extends Converter<Car, CarDto> {
11+
@Mapping(target = "seats", source = "seatConfiguration")
12+
CarDto convert(Car car);
13+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.mapstruct.extensions.spring.example.boot.mappers;
2+
3+
import org.mapstruct.MapperConfig;
4+
import org.mapstruct.extensions.spring.SpringMapperConfig;
5+
import org.mapstruct.extensions.spring.example.boot.ConversionServiceAdapter;
6+
7+
@MapperConfig(componentModel = "spring", uses = ConversionServiceAdapter.class)
8+
@SpringMapperConfig(conversionServiceAdapterPackage = "org.mapstruct.extensions.spring.example.boot")
9+
public interface MapperSpringConfig {
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.mapstruct.extensions.spring.example.boot.mappers;
2+
3+
import org.mapstruct.Mapper;
4+
import org.mapstruct.Mapping;
5+
import org.mapstruct.extensions.spring.example.SeatConfiguration;
6+
import org.mapstruct.extensions.spring.example.SeatConfigurationDto;
7+
import org.springframework.core.convert.converter.Converter;
8+
9+
@Mapper(config = MapperSpringConfig.class)
10+
public interface SeatConfigurationMapper extends Converter<SeatConfiguration, SeatConfigurationDto> {
11+
@Mapping(target = "seatCount", source = "numberOfSeats")
12+
@Mapping(target = "material", source = "seatMaterial")
13+
SeatConfigurationDto convert(SeatConfiguration seatConfiguration);
14+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.mapstruct.extensions.spring.example.boot.mappers;
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.boot.mappers.MapperSpringConfig;
7+
import org.springframework.core.convert.converter.Converter;
8+
9+
@Mapper(config = MapperSpringConfig.class)
10+
public interface WheelMapper extends Converter<Wheel, WheelDto> {
11+
@Override
12+
WheelDto convert(Wheel source);
13+
}
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.boot.mappers;
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.mapstruct.extensions.spring.example.boot.mappers.MapperSpringConfig;
7+
import org.springframework.core.convert.converter.Converter;
8+
9+
import java.util.List;
10+
11+
@Mapper(config = MapperSpringConfig.class)
12+
public interface WheelsDtoListMapper extends Converter<List<WheelDto>, Wheels> {
13+
@Override
14+
Wheels convert(List<WheelDto> source);
15+
}

0 commit comments

Comments
 (0)