当前位置: 首页 > 知识库问答 >
问题:

MapStruct decorator对生成的代码没有影响

呼延明朗
2023-03-14

我编写了所需的带有注释的接口和作为装饰器的抽象类。生成(mvn清理包)后,通过“默认”过程更新修饰的函数,得到的是参数和结果类型。我不知道,有什么问题。你能帮帮我吗?

环境:mapstruct版本1.4.2。lombok最终版本1.18.22(Spring boot 2.6.3)lombok mapstruct绑定: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();
}

共有1个答案

钱劲
2023-03-14

检查BeerMapperDecorator的实现,此类被标记为主注入依赖项。

应该看起来像这样:

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2022-03-01T20:17:02+0100",
    comments = "version: 1.5.0.Beta2, compiler: Eclipse JDT (IDE) 1.4.50.v20210914-1429, environment: Java 17.0.1 (Azul Systems, Inc.)"
)
@Component
@Primary
public class BeerMapperImpl extends BeerMapperDecorator {

    @Autowired
    @Qualifier("delegate")
    private BeerMapper delegate;

    @Override
    public BeerDto beerToBeerDto(Beer beer)  {
        return delegate.beerToBeerDto( beer );
    }

    @Override
    public Beer beerDtoToBeer(BeerDto beerDto)  {
        return delegate.beerDtoToBeer( beerDto );
    }
}

您正在查看的接口被标记为委托接口:

@Component
@Qualifier("delegate")
public class BeerMapperImpl_ implements BeerMapper {
 类似资料:
  • 我正在根据参考指南学习使用Map结构。日食验证是 面向Web开发人员的Eclipse Java EE IDE。版本:开普勒服务版本2 pom。xml如下所示,与参考指南相同 它表示在构建项目时将生成实现代码。但是,它似乎不会在目标/生成的源文件夹下生成

  • 更新2017-05-17。我不再为这个问题产生的公司工作,也没有访问Delphi XEX的权限。当我在那里的时候,这个问题通过迁移到混合的FPC+GCC(Pascal+C)得到了解决,在一些例程中使用了霓虹灯的固有特性,在那里它起到了很大的作用。(强烈推荐使用FPC+GCC,因为它支持使用标准工具,特别是Valgrind。)如果有人能用可信的例子来演示他们是如何从Delphi XEx中生成优化的A

  • 大多数Blockly应用程序需要将块转换为代码以执行。本页描述如何将代码生成器添加到自定义块。 首先,转到generators/目录并选择与您要生成的语言(JavaScript,Python,PHP,Lua,Dart等)相对应的子目录。假设您的代码块不适合现有类别,请创建一个新的JavaScript文件。这个新的JavaScript文件需要包含在<script ...>编辑器的HTML文件中的标记

  • Jboot 内置了一个简易的代码生成器,可以用来生成model层和Service层的基础代码,在生成代码之前,请先配置jboot.properties关于数据库相关的配置信息,Jboot 代码生成器会通过该配置去链接数据库。 jboot.datasource.type=mysql jboot.datasource.url=jdbc:mysql://127.0.0.1:3306/jbootdemo

  • 遵照此规范,在实际操作中,有许多重复。接下来推荐一款专为本规范量身定做的代码生成器 Laravel 5.x Scaffold Generator。 本扩展支持 5.1 ~ 5.5 版本的 Laravel。 只需要一个命令: 即可生成: $ php artisan make:scaffold Projects --schema="name:string:index,description:text:

  • 注: 内容来自官网资料 Java Generated Code 这个页面准确描述 protocol buffer 编译器为任何给定协议定义生成的java代码。proto2和proto3生成的代码之间的任何不同都将被高亮 - 注意在这份文档中描述的是这些生成代码的不同,而不是基本的消息类/接口,后者在两个版本中是相同的。在阅读这份文档之前你应该先阅读 proto2语言指南 和/或 proto3语言指