我在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类似问题中所述,但这是行不通的。
谢谢!
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在OSGi环境中使用MapStruct时,由于类加载机制与标准Java项目不同,因此可能会遇到一些挑战。MapStruct默认情况下生成的实现类可能无法被OSGi框架正确识别和加载,尤其是在使用像Maven Bundle Plugin(或bnd-maven-plugin)来打包成OSGi bundle时。
为了解决这个问题,你需要确保MapStruct生成的实现类能够被正确地导出和导入到你的OSGi环境中的适当bundle中。以下是一些建议步骤:
确保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>
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
以避免包分裂问题。
检查Classloading问题: 在OSGi环境下,如果MapStruct生成的类没有被正确地导出和导入,可能会导致类加载失败。确保调用MapStruct接口的bundle能够访问到这个接口及其实现类。
清理并重建: 有时候,即使配置正确,也需要完全清理构建目录(包括.osgi
、.generated
等目录),然后重新构建整个项目,以确保所有更改都已生效。
如果以上步骤仍然不能解决问题,可能需要更深入地查看OSGi容器的日志,寻找有关类加载失败的具体错误信息,以便进一步诊断问题所在。