MapStruct装饰器没有效果生成代码
我用注释编写了所需的接口,并使用抽象类作为装饰器。生成(mvn clean包)后,装饰函数由“默认”过程更新,形成参数和结果类型。我不知道,有什么问题。你能帮我吗?
环境: 映射结构版本 1.4.2.Final lombok 版本 1.18.22 (Spring boot 2.6.3) lombok-mapstruct-binding: 0.2.0
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${lombok-mapstruct-binding.version}</version>
</dependency>
和
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
</exclude>
<exclude>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${lombok-mapstruct-binding.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<compilerArg>-Amapstruct.defaultComponentModel=spring</compilerArg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
Mapper 接口声明:
@Mapper(componentModel = "spring", uses = {DateMapper.class})
@DecoratedWith(BeerMapperDecorator.class)
public interface BeerMapper
{
BeerMapper INSTANCE = Mappers.getMapper(BeerMapper.class);
BeerDto beerToBeerDto(Beer beer);
Beer beerDtoToBeer(BeerDto beerDto);
BeerDto beerToBeerDtoWithInventory(Beer beer);
}
装饰器:
public abstract class BeerMapperDecorator implements BeerMapper {
@Autowired
@Qualifier("delegate")
private BeerMapper delegate;
private BeerInventoryService beerInventoryService;
@Autowired
public void setBeerInventoryService(BeerInventoryService beerInventoryService) {
this.beerInventoryService = beerInventoryService;
}
@Override
public BeerDto beerToBeerDtoWithInventory(Beer beer) {
BeerDto dto = delegate.beerToBeerDto(beer);
dto.setQuantityOnHand(beerInventoryService.getOnhandInventory(beer.getId()));
System.out.println(" ----------- Decorated --------------");
return dto;
}
}
以及生成的源代码:
@Override
public BeerDto beerToBeerDtoWithInventory(Beer beer) {
if ( beer == null ) {
return null;
}
BeerDtoBuilder beerDto = BeerDto.builder();
beerDto.id( beer.getId() );
if ( beer.getVersion() != null ) {
beerDto.version( beer.getVersion().intValue() );
}
beerDto.createdDate( dateMapper.asOffsetDateTime( beer.getCreatedDate() ) );
beerDto.lastModifiedDate( dateMapper.asOffsetDateTime( beer.getLastModifiedDate() ) );
beerDto.beerName( beer.getBeerName() );
beerDto.upc( beer.getUpc() );
beerDto.price( beer.getPrice() );
return beerDto.build();
}
I wrote the needed interface wit annotations and, an abstract class as decorator. After the generation (mvn clean package) the decorated function updated by the "default" process, what come form parameter and result type. I don't know, what is the problem. Could you help me?
Environment:
mapstruct version 1.4.2.Final
lombok version 1.18.22 (Spring boot 2.6.3)
lombok-mapstruct-binding: 0.2.0
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${lombok-mapstruct-binding.version}</version>
</dependency>
and
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
</exclude>
<exclude>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${lombok-mapstruct-binding.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<compilerArg>-Amapstruct.defaultComponentModel=spring</compilerArg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
The Mapper inteface declaration:
@Mapper(componentModel = "spring", uses = {DateMapper.class})
@DecoratedWith(BeerMapperDecorator.class)
public interface BeerMapper
{
BeerMapper INSTANCE = Mappers.getMapper(BeerMapper.class);
BeerDto beerToBeerDto(Beer beer);
Beer beerDtoToBeer(BeerDto beerDto);
BeerDto beerToBeerDtoWithInventory(Beer beer);
}
The decorator:
public abstract class BeerMapperDecorator implements BeerMapper {
@Autowired
@Qualifier("delegate")
private BeerMapper delegate;
private BeerInventoryService beerInventoryService;
@Autowired
public void setBeerInventoryService(BeerInventoryService beerInventoryService) {
this.beerInventoryService = beerInventoryService;
}
@Override
public BeerDto beerToBeerDtoWithInventory(Beer beer) {
BeerDto dto = delegate.beerToBeerDto(beer);
dto.setQuantityOnHand(beerInventoryService.getOnhandInventory(beer.getId()));
System.out.println(" ----------- Decorated --------------");
return dto;
}
}
And the generated source:
@Override
public BeerDto beerToBeerDtoWithInventory(Beer beer) {
if ( beer == null ) {
return null;
}
BeerDtoBuilder beerDto = BeerDto.builder();
beerDto.id( beer.getId() );
if ( beer.getVersion() != null ) {
beerDto.version( beer.getVersion().intValue() );
}
beerDto.createdDate( dateMapper.asOffsetDateTime( beer.getCreatedDate() ) );
beerDto.lastModifiedDate( dateMapper.asOffsetDateTime( beer.getLastModifiedDate() ) );
beerDto.beerName( beer.getBeerName() );
beerDto.upc( beer.getUpc() );
beerDto.price( beer.getPrice() );
return beerDto.build();
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
检查
BeerMapperDecorator
的实现,该类被标记为主要注入依赖项。应该看起来像这样:
您正在查看的接口被标记为委托接口:
Check the implementation of the
BeerMapperDecorator
, this class is marked as the primary injection dependency.Should look something like this:
The one you're looking at is marked as the delegate interface: