推土机映射的常数

时间:2009-05-13 15:02:09

标签: java dozer

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

6 个答案:

答案 0 :(得分:3)

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

您可能需要为此映射注册custom converter

答案 1 :(得分:2)

如何利用事件机制?

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

答案 2 :(得分:1)

推土机的最新版本使这更容易。您可以指定自定义转换器,您可以为给定的字段映射指定该转换器的参数。创建一个单独的'ConstantConverter'应该是微不足道的,它将获取一个输入参数,并在100%的时间内将它放在输出字段中。

答案 3 :(得分:0)

使用ModelMapper时非常简单:

ModelMapper modelMapper = new ModelMapper();

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

此示例将someConstant映射到DestClass.someProperty

您可以在http://modelmapper.org

查看更多示例和文档

答案 4 :(得分:0)

一种可能的实现方式是:

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-field名称的类型为String。

答案 5 :(得分:0)

假设您只想在单向映射中执行此操作,则以下内容将适用于String常量:

/**
 * 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");
    }
}