【发布时间】:2009-05-13 15:02:09
【问题描述】:
有人知道如何使用推土机将常量值放入属性中吗?我在推土机的文档中没有看到任何相关内容
【问题讨论】:
有人知道如何使用推土机将常量值放入属性中吗?我在推土机的文档中没有看到任何相关内容
【问题讨论】:
不完全确定您的意思 - 如果您希望 Dozer 在您从 BeanA 映射到 BeanB 时始终使用常量填充 BeanB.someField?
您可能希望为此映射注册custom converter。
【讨论】:
利用事件机制怎么样?
因此,您可以注册一个侦听器,该侦听器将在您的侦听器的mappingFinished() 中设置值。
详情请咨询dozer doc on events。当然,您必须使用某种if ... instanceof 条件来保护设置代码。
【讨论】:
preWritingDestinationValue 上,所以这些值充当默认值,而不是覆盖已经映射的内容。
推土机的最新版本使这更容易。您可以同时指定自定义转换器和,您可以为给定字段映射指定该转换器的参数。创建一个单一的“ConstantConverter”应该很简单,它将接受一个输入参数并将其 100% 的时间放在输出字段中。
【讨论】:
一种可能的实现方式是:
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 可能更清楚。如果以另一种方式尝试映射(即不在单向映射中),也可以考虑抛出异常。
class 作为源字段以消除对一个虚拟字段。
ModelMapper 非常简单:
ModelMapper modelMapper = new ModelMapper();
modelMapper.addMappings(new PropertyMap<SourceClass, DestClass>() {
protected void configure() {
map().setSomeProperty(someConstant);
}
});
此示例将someConstant 映射到DestClass.someProperty。
您可以查看更多示例和文档:http://modelmapper.org
【讨论】:
假设您只想在单向映射中执行此操作,以下将适用于字符串常量:
/**
* 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");
}
}
【讨论】: