FAQ解释了如何在XML中执行此操作。 这显示了如何使用 API 按类执行此操作。 问题是你必须在类上设置它。 如果我只想在一个字段上使用它怎么办? 这可能吗?
你不需要转换器。推土机可以轻松完成:
import static org.dozer.loader.api.TypeMappingOptions.mapNull;
import static org.dozer.loader.api.TypeMappingOptions.mapEmptyString;
...
public Mapper getMapper() {
DozerBeanMapper mapper = new DozerBeanMapper();
mapper.addMapping(beanMappingBuilder());
return mapper;
}
private BeanMappingBuilder beanMappingBuilder() {
return new BeanMappingBuilder() {
@Override
protected void configure() {
mapping(ClassA.class, ClassB.class, mapNull(false), mapEmptyString(false));
}
}
}
我能够通过为此创建自己的自定义转换器来完成我需要的东西。 代码如下:
import org.apache.commons.lang.StringUtils;
import org.dozer.DozerConverter;
public class IfNotBlankConverter extends DozerConverter<String, String> {
public IfNotBlankConverter() {
super(String.class, String.class);
}
private String getObject(String source, String destination) {
if (StringUtils.isNotBlank(source)) {
return source;
} else {
return destination;
}
}
@Override
public String convertTo(String source, String destination) {
return getObject(source, destination);
}
@Override
public String convertFrom(String source, String destination) {
return getObject(source, destination);
}
}
第二个:
import org.dozer.DozerConverter;
public class IfNotNullConverter extends DozerConverter<Object, Object> {
public IfNotNullConverter() {
super(Object.class, Object.class);
}
@Override
public Object convertTo(Object source, Object destination) {
return getObject(source, destination);
}
@Override
public Object convertFrom(Object source, Object destination) {
return getObject(source, destination);
}
private Object getObject(Object source, Object destination) {
if (source != null) {
return source;
} else {
return destination;
}
}
}
您可以使用以下命令绕过 XML 配置中的空值
<mapping map-null="false">
<class-a>org.dozer.vo.AnotherTestObject</class-a>
<class-b>org.dozer.vo.AnotherTestObjectPrime</class-b>
<field>
<a>field4</a>
<b>to.one</b>
</field>
</mapping>
为了未来的读者:自定义转换器的解决方案对我不起作用。似乎在映射过程中忽略了转换器。
但是,定义自定义字段映射器确实工作得很好:(用java 8编写(
dozerBeanMapper.setCustomFieldMapper((source, destination, sourceFieldValue, classMap, fieldMapping) ->
sourceFieldValue == null);
此映射器返回一个布尔值,指示为该字段完成映射的天气。因此,如果对象为 null,则返回 true 将通知推土机映射已完成。发送 false 将继续默认映射。(请参阅 MappingProcessor.java - mapField 方法(