Кто-нибудь знает, как поместить постоянное значение в атрибут с помощью dozer? Я ничего не видел об этом в документации бульдозера
Константы в отображениях бульдозера
Ответы (6)
Не совсем уверен, что вы имеете в виду - если вы хотите, чтобы Dozer всегда заполнял BeanB.someField константой всякий раз, когда вы сопоставляете BeanA с BeanB?
Вы можете зарегистрировать для этого сопоставления пользовательский преобразователь.
Как насчет того, чтобы воспользоваться преимуществами механизма событий?
Таким образом, вы можете зарегистрировать слушателя, который будет устанавливать значение в mappingFinished()
вашего слушателя. Подробнее см. в документе dozer по событиям. Конечно, вам придется защищать код настройки каким-то if ... instanceof
условием.
preWritingDestinationValue
, поэтому значения действуют как значения по умолчанию, а не переопределяют то, что уже было сопоставлено.
- person tzrlk; 05.03.2014
Последние сборки бульдозера облегчают эту задачу. Вы можете указать оба пользовательских преобразователя, и вы можете указать параметры для этого преобразователя для данного сопоставления полей. Должно быть тривиально создать один «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-класса имеет тип String.
OneWayConstantConverter
. Можно также рассмотреть возможность создания исключения, если сопоставление выполняется наоборот (т. е. не в одностороннем сопоставлении).
- person Steve Chambers; 03.09.2019
class
в качестве исходного поля, чтобы исключить необходимость в фиктивном поле.
- person Steve Chambers; 05.09.2019
Это довольно просто с ModelMapper:
ModelMapper modelMapper = new ModelMapper();
modelMapper.addMappings(new PropertyMap<SourceClass, DestClass>() {
protected void configure() {
map().setSomeProperty(someConstant);
}
});
Этот пример сопоставляет someConstant
с DestClass.someProperty
.
Вы можете ознакомиться с дополнительными примерами и документацией по адресу: http://modelmapper.org.
Предполагая, что вы хотите сделать это только в одностороннем сопоставлении, для константы 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");
}
}