我想将带有键值对List的类映射到带有dozer的hashmap。
这是持有键值对的类
public class TExtensions {
private List<SExtension> item;
// Getter, Setter
public class SExtension {
private String field;
private String value;
// Getter, Setter
这是我的两个豆子
public class FooModel {
private Map extensions;
// Getter, Setter
public class FooWs {
private TExtensions extensions;
public class ExtensionConverter extends DozerConverter<Map, TExtensions>
{
public ExtensionConverter() {
super(Map.class, TExtensions.class);
}
@Override
public TExtensions convertTo(Map source, TExtensions destination) {
if (source != null && !source.isEmpty()){
destination = new TExtensions();
SExtension extension;
for (Object key : source.keySet()){
extension = new SExtension();
extension.setField(key.toString());
extension.setValue(source.get(key).toString());
destination.getItem().add(extension);
}
} else{
destination = null;
}
return destination;
}
@Override
public Map convertFrom(TExtensions source, Map destination) {
if (source != null){
destination = new HashMap<String, String>();
for (SExtension extension : source.getItem()){
destination.put(extension.getField(), extension.getValue());
}
} else{
destination = null;
}
return destination;
}
}
当我通过配置进行映射时,它运行良好,但是我无法使用该功能,因为类不是总是属于类路径的一部分,因为它们是可选模块的一部分。所以我必须将映射放在其他地方并将其放入映射文件中,但这不起作用。
虽然有效,但我无法使用
<configuration>
<custom-converters>
<converter type="ExtensionConverter">
<class-a>java.util.Map</class-a>
<class-b>TExtensions</class-b>
</converter>
</custom-converters>
</configuration>
这不起作用,但它似乎是唯一的选择
<mapping>
<class-a>FooModel</class-a>
<class-b>FooWs</class-b>
<field custom-converter="ExtensionConverter">
<a>extensions</a>
<b>extensions</b>
</field>
</mapping>
当我使用映射文件(而不是配置)进行映射时,它会从Map映射到TExtension,但不会映射到另一个方向。当我调试Converter时,源对象和目标对象都为空。
我已经使用Dozer 5.5.1和Dozer 5.4.0进行了测试
现在我可以为我的问题考虑两个解决方案
我会优先考虑第一个解决方案,因为它似乎更清晰,我不必复制映射文件。
你有什么想法吗?