【发布时间】:2019-11-28 09:55:50
【问题描述】:
我在一个普通的 Java 项目中使用 Mapstruct,它是一个 OSGi 包。我添加了一些基本代码:
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;
}
当我构建包时,它将在以下范围内生成实现:
target/generated-sources/annotations/AccountPreferencesMapperImpl.java
问题是,当我调用 AccountPreferencesMapper.MAPPER 时,我无法得到它。它会说它是 null 或者我得到:Could not initialize class 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 类似问题中所述,但它不起作用。
谢谢!
【问题讨论】:
-
你试过
@Mapping(target= "r.defaultName", source= "name") MappedAccountPreferences toMappedAccountPreferences(Map<String, Object> r);吗? -
我尝试使用 r.defaultName 而不是表达式。问题似乎出在参考部分。该项目无法从 target/generated-source/annotations/ 中看到 Impl 类
-
我错过了这样的包裹:
target/generated-sources/annotations/com/XXX/XXX/test/AccountPreferencesMapperImpl.java -
而且.. 你可以定义一个
default方法,只是映射方法而不是使用表达式。比如default String mapFromDefaultName(Map in) { return in.get("defaultName") }会被toMappedAccountPreferences自动调用