【问题标题】:How can I tell Dozer to bypass mapping null or empty string values per field using the programming api?我如何告诉 Dozer 使用编程 api 绕过每个字段映射 null 或空字符串值?
【发布时间】:2013-10-08 19:48:16
【问题描述】:

The faq explains 如何在 XML 中执行此操作。这显示了如何为每个班级 using the API 执行此操作。问题是你必须在课堂上设置它。如果我只想在一个字段上使用它怎么办?这可能吗?

【问题讨论】:

    标签: java dozer


    【解决方案1】:

    您不需要转换器。推土机可以轻松完成:

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

    【讨论】:

    • 如何在 XML 映射中做到这一点?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

        您可以使用以下方法绕过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>   
        

        【讨论】:

          猜你喜欢
          • 2014-03-02
          • 1970-01-01
          • 2013-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多