【问题标题】:Constants in dozer mappings推土机映射中的常量
【发布时间】:2009-05-13 15:02:09
【问题描述】:

有人知道如何使用推土机将常量值放入属性中吗?我在推土机的文档中没有看到任何相关内容

【问题讨论】:

    标签: java dozer


    【解决方案1】:

    不完全确定您的意思 - 如果您希望 Dozer 在您从 BeanA 映射到 BeanB 时始终使用常量填充 BeanB.someField?

    您可能希望为此映射注册custom converter

    【讨论】:

    • 是的,这正是我想要的。我想知道是否可以在没有自定义转换器的情况下直接执行此操作。
    • 顺便说一句,谢谢你的回答。
    • 我相信您唯一的方法是使用自定义转换或在调用 Dozer 时手动进行。 Dozer 只真正处理从一个 bean 到另一个 bean 的映射,并没有给您太多空间来插入其他逻辑(这是有道理的,因为它并不打算这样做)。
    【解决方案2】:

    利用事件机制怎么样?

    因此,您可以注册一个侦听器,该侦听器将在您的侦听器的mappingFinished() 中设置值。 详情请咨询dozer doc on events。当然,您必须使用某种if ... instanceof 条件来保护设置代码。

    【讨论】:

    • 这对我来说效果很好,虽然我把我的钩子放在preWritingDestinationValue 上,所以这些值充当默认值,而不是覆盖已经映射的内容。
    【解决方案3】:

    推土机的最新版本使这更容易。您可以同时指定自定义转换器,您可以为给定字段映射指定该转换器的参数。创建一个单一的“ConstantConverter”应该很简单,它将接受一个输入参数并将其 100% 的时间放在输出字段中。

    【讨论】:

    • 实际上使用自定义转换器并不容易。您要么需要为包含该字段的整个类编写一个转换器(这首先破坏了使用推土机的目的),要么使用丑陋的解决方案将转换器附加到单个字段(并且该字段仅存在于一个的类)。不过,在某些情况下,这可能是一种不错的方法(取决于您的对象的结构)。
    【解决方案4】:

    一种可能的实现方式是:

    public class ConstantsCustomConvertor implements ConfigurableCustomConverter{
    
        private String pararamter;
        @Override
        public Object convert(Object existingDestinationFieldValue, Object sourceFieldValue, Class<?> destinationClass, Class<?> sourceClass) {     
            return pararamter;
        }
    
        @Override
        public void setParameter(String parameter) {
            this.pararamter = parameter;
    
        }
    }
    

    例子:

    <field custom-converter-param="CONTANT_VALUE" custom-converter="org.yourcompany.ConstantsCustomConvertor">
        <a>a-class-dummyfieldname</a>
        <b>b-class-fieldname</b>
    </field>    
    

    此自定义转换器假定 b-class-fieldname 为字符串类型。

    【讨论】:

    • 将其重命名为OneWayConstantConverter 可能更清楚。如果以另一种方式尝试映射(即不在单向映射中),也可以考虑抛出异常。
    • 我现在发布了一个answer,它以类似的方式执行此操作,但确保它仅用于单向映射并使用class 作为源字段以消除对一个虚拟字段。
    【解决方案5】:

    ModelMapper 非常简单:

    ModelMapper modelMapper = new ModelMapper();
    
    modelMapper.addMappings(new PropertyMap<SourceClass, DestClass>() {
      protected void configure() {
        map().setSomeProperty(someConstant);
      }
    });
    

    此示例将someConstant 映射到DestClass.someProperty

    您可以查看更多示例和文档:http://modelmapper.org

    【讨论】:

      【解决方案6】:

      假设您只想在单向映射中执行此操作,以下将适用于字符串常量:

      /**
       * Custom one-way Dozer converter mapping to constant string value specified by a parameter.
       */
      public class OneWayStringConstantConverter extends DozerConverter<Class, String> {
      
          public OneWayBooleanConstantConverter() {
              super(Class.class, String.class);
          }
      
          @Override
          public String convertTo(Class aClass, String aString) {
              // Return constant value specified by the parameter (source is ignored)
              return getParameter();
          }
      
          @Override
          public Class convertFrom(String aString, Class aClass) {
              throw new UnsupportedOperationException(
                      "OneWayStringConstantConverter should only be used in one-way mappings");
          }
      }
      

      ...调用者:

        <field custom-converter="full.path.to.OneWayStringConstantConverter"
               custom-converter-param="My constant string value">
           <a>class</a> <!-- Source not used: Converter only sets target of a one-way mapping -->
           <b>targetField</b>
        </field>
      

      建议使用 class 值作为虚拟“源字段”,因为它尚未使用 getClass() 方法保证存在于任何对象上。

      我需要为布尔值做它,所以使用了这个:

      /**
       * Custom one-way Dozer converter which maps to the constant boolean value (true or false)
       * specified by a parameter.
       */
      public class OneWayBooleanConstantConverter extends DozerConverter<Class, Boolean> {
      
          public OneWayBooleanConstantConverter() {
              super(Class.class, Boolean.class);
          }
      
          @Override
          public Boolean convertTo(Class aClass, Boolean aBoolean) {
              // Return constant boolean value specified by the parameter (source is ignored)
              return Boolean.parseBoolean(getParameter());
          }
      
          @Override
          public Class convertFrom(Boolean aBoolean, Class aClass) {
              throw new UnsupportedOperationException(
                      "OneWayBooleanConstantConverter should only be used in one-way mappings");
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多