开发者社区 问答 正文

MapStruct-未找到MapperImpl

我在OSGi捆绑包的普通Java项目中使用Mapstruct。我添加了一些基本代码:

package com.XXX.XXX.test;

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

import java.util.Map;

@Mapper
public interface AccountPreferencesMapper {
    AccountPreferencesMapper MAPPER = Mappers.getMapper(AccountPreferencesMapper.class);

    @Mapping(expression = "java((String) r.get(\"defaultName\"))", target = "name")
    MappedAccountPreferences toMappedAccountPreferences(Map<String, Object> r);
}

package com.XXX.XXX.test;

public class MappedAccountPreferences {
    public String name;
}

当我构建软件包时,它将在以下位置生成实现:

目标/生成源/注释/AccountPreferencesMapperImpl.java

问题是,当我调用AccountPreferencesMapper.MAPPER时,无法获取它。它会说它为null或获取:无法初始化类com.XXX.XXX.test.AccountPreferencesMapper

我与以下代码位于同一个程序包中:

Map accountPreferencesMap = new HashMap<String, Object>();
accountPreferencesMap.put("defaultName", "User Name");
MappedAccountPreferences dto = AccountPreferencesMapper.MAPPER.toMappedAccountPreferences( accountPreferencesMap );

请注意,我必须使用以下代码编译代码:mvn clean install和mvn content-package:install(我没有使用任何编辑器进行构建)

我曾尝试在POM中添加mapstruct-jdk8 / mapstruct-processor作为单独的依赖项,如其他stackoverflow mapstruct类似问题中所述,但这是行不通的。

谢谢!

展开
收起
垚tutu 2019-11-28 18:43:18 1566 分享 版权
阿里云 AI 助理回答

在OSGi环境中使用MapStruct时,由于类加载机制与标准Java项目不同,因此可能会遇到一些挑战。MapStruct默认情况下生成的实现类可能无法被OSGi框架正确识别和加载,尤其是在使用像Maven Bundle Plugin(或bnd-maven-plugin)来打包成OSGi bundle时。

为了解决这个问题,你需要确保MapStruct生成的实现类能够被正确地导出和导入到你的OSGi环境中的适当bundle中。以下是一些建议步骤:

  1. 确保MapStruct处理器在编译时运行: 确保你的pom.xml配置了MapStruct的注解处理器。尽管你提到已经尝试过添加mapstruct-jdk8或mapstruct-processor,但请确认这部分配置是正确的。一个典型的配置如下:

    <dependencies>
       <!-- MapStruct -->
       <dependency>
           <groupId>org.mapstruct</groupId>
           <artifactId>mapstruct</artifactId>
           <version>${mapstruct.version}</version>
       </dependency>
       <dependency>
           <groupId>org.mapstruct</groupId>
           <artifactId>mapstruct-processor</artifactId>
           <version>${mapstruct.version}</version>
           <scope>provided</scope>
       </dependency>
    </dependencies>
    
    <build>
       <plugins>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>${maven.compiler.plugin.version}</version>
               <configuration>
                   <source>1.8.0_345</source>
                   <target>1.8.0_345</target>
                   <annotationProcessorPaths>
                       <path>
                           <groupId>org.mapstruct</groupId>
                           <artifactId>mapstruct-processor</artifactId>
                           <version>${mapstruct.version}</version>
                       </path>
                   </annotationProcessorPaths>
               </configuration>
           </plugin>
       </plugins>
    </build>
    
  2. OSGi元数据调整: 使用BND工具或Maven Bundle Plugin来确保MapStruct生成的类能被正确导出和导入。你可能需要手动指定这些类或者使用适当的指令来自动导出由MapStruct生成的包。例如,在<build>部分加入以下配置:

    <build>
       ...
       <plugins>
           ...
           <plugin>
               <groupId>org.apache.felix</groupId>
               <artifactId>maven-bundle-plugin</artifactId>
               <extensions>true</extensions>
               <configuration>
                   <instructions>
                       <Export-Package>
                           com.XXX.XXX.test,
                           org.mapstruct.*;version=${mapstruct.version};-split-package:=merge-first
                       </Export-Package>
                       <Import-Package>
                           *
                       </Import-Package>
                   </instructions>
               </configuration>
           </plugin>
       </plugins>
    </build>
    

    注意这里的org.mapstruct.*是为了示例,实际应根据MapStruct生成的实现类所在的包进行调整,并且考虑是否需要-split-package:=merge-first以避免包分裂问题。

  3. 检查Classloading问题: 在OSGi环境下,如果MapStruct生成的类没有被正确地导出和导入,可能会导致类加载失败。确保调用MapStruct接口的bundle能够访问到这个接口及其实现类。

  4. 清理并重建: 有时候,即使配置正确,也需要完全清理构建目录(包括.osgi.generated等目录),然后重新构建整个项目,以确保所有更改都已生效。

如果以上步骤仍然不能解决问题,可能需要更深入地查看OSGi容器的日志,寻找有关类加载失败的具体错误信息,以便进一步诊断问题所在。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: