5

常见问题解答解释了如何在 XML 中执行此操作。这显示了如何使用 API为每个类执行此操作。问题是你必须在课堂上设置它。如果我只想在一个字段上使用它怎么办?这可能吗?

4

4 回答 4

7

你不需要转换器。推土机可以轻松做到:

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));
        }
    }
}
于 2016-08-10T13:53:51.720 回答
3

通过为此创建自己的自定义转换器,我能够完成我需要的工作。这是代码:

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;
        }
    }

}
于 2013-10-08T20:17:25.313 回答
1

您可以使用以下内容绕过 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>   
于 2019-09-05T19:39:19.777 回答
1

为了未来的读者:使用自定义转换器的解决方案对我不起作用。在映射过程中似乎只是忽略了转换器。

但是,定义自定义字段映射器确实工作得很好:(用 java 8 编写)

dozerBeanMapper.setCustomFieldMapper((source, destination, sourceFieldValue, classMap, fieldMapping) ->
            sourceFieldValue == null);

此映射器返回一个布尔值,指示为该字段完成映射的天气。因此,如果对象为 null,则返回 true,将通知 Dozer 映射已完成。发送 false 将继续默认映射。(参见 MappingProcessor.java - mapField 方法)

于 2016-04-19T10:42:57.780 回答