【问题标题】:Using java MapStruct with VSCode在 VSCode 中使用 java MapStruct
【发布时间】:2020-07-03 16:47:47
【问题描述】:

我正在使用 java Mapstruct。使用gradle bootRun 运行正常,但我在使用 VSCode 调试和运行单元测试时遇到了一些问题:java.lang.ClassNotFoundException: Cannot find implementation

信息:IDE VSCode、SpringBoot 2.2.2、Java SDK 11、Gradle 6.1.1

build.gradle:

compileJava {
    options.compilerArgs = [
            '-Amapstruct.defaultComponentModel=spring'
    ]
}

dependencies {
    implementation 'org.mapstruct:mapstruct-jdk8:1.3.1.Final'
    implementation 'org.mapstruct:mapstruct-processor:1.3.1.Final'
    annotationProcessor 'org.mapstruct:mapstruct-processor:1.3.1.Final'
    testAnnotationProcessor 'org.mapstruct:mapstruct-processor:1.3.1.Final'
}

launch.json 用于在 VSCode 中进行调试:

 {
            "type": "java",
            "name": "Debug (Launch)-DemoApplication<demo>",
            "request": "launch",
            "mainClass": "com.api.demo.DemoApplication",
            "projectName": "demo",
            "args": [
                "-Amapstruct.defaultComponentModel=spring",
                "-DprocessorIntegrationTest.debug=true",
                "-classpath",
                "${workspaceFolder}/build/classes/"
            ],
            "sourcePaths": [
                "${workspaceFolder}/build/generated/"
            ]
        }

映射器文件:

@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserPayloadMapper extends GenericPayloadMapper<User, UserRegistryRequest, UserRegistryResponse> {
    UserPayloadMapper INSTANCE = Mappers.getMapper(UserPayloadMapper.class);

    @Mapping(source = "userId", target = "id")
    public User fromRequest(UserRegistryRequest request);

    public UserRegistryResponse toResponse(User user);
}

谁能帮我配置 VSCode 以运行调试和单元测试?在运行调试和单元测试之前我想,它不会加载生成的源代码,但我不知道如何修复它。

编辑: 对于单元测试文件,如果我添加@SpringBootTest(classes = { UserPayloadMapper.class }) 这将正常运行,但在单元测试代码内部没有与此映射器相关的任何内容,并且我有几个这样的映射器,我不能将它们全部放入每个单元测试中。

【问题讨论】:

    标签: java visual-studio-code mapstruct


    【解决方案1】:

    我找到了解决方案:添加 @ComponentScan(basePackages = "com.api.demo/build/classes/java/main/com/api/demo/service/mapper") 并且它可以工作(到 mapstruct 生成的文件夹中)。

    【讨论】:

      【解决方案2】:
      // Dependency for build.gradle
      
      dependencies {
      compile group: 'org.mapstruct', name: 'mapstruct-jdk8', version: '1.2.0.Final'
      annotationProcessor 'org.mapstruct:mapstruct-processor:1.2.0.Final'
      }
      
      // Interface for Mapping from Dto to Model
      
      @Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
      public interface Mapper {
          DatabaseDto toModel(ModelDto source);
      
          // Converting DatabaseDto to ModelDto based on the matched Columns
      
         // Mappings with Different Column names from Source to Destination
      @Mappings({
            @Mapping(target="id", source="dto.employeeId"),
            @Mapping(target="name", source="dto.employeeName")
          })
          ModelDto fromModel(DatabaseDto dto);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-07
        • 2022-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多