Dozer Булево отображение свойств
Похоже, что Dozer не будет отображать логическое свойство, если аксессор этого свойства определяется как isProperty()
, а не getProperty()
.
Следующий groovy script иллюстрирует проблему:
import org.dozer.*
class ProductCommand {
Boolean foo
}
public class ProductDto {
private Boolean foo;
public Boolean isFoo() { this.foo }
public void setFoo(Boolean p0) { this.foo = p0 }
}
def mapper = new DozerBeanMapper()
dto = new ProductDto(foo: true)
assert dto.isFoo()
ProductCommand mappedCmd = mapper.map(dto, ProductCommand)
assert mappedCmd.foo
Утверждение об окончательной строке не выполняется. Однако, если я переименую ProductDto.isFoo()
в ProductDto.getFoo()
, он пройдет.
Есть ли флаг/параметр, который я могу установить в файле сопоставления Dozer, который будет инструктировать его использовать либо аксессуар is
, либо get
для булевых свойств? В качестве альтернативы я мог бы добавить настраиваемое правило для каждого логического свойства, но это не очень привлекательно.
Хотя приведенный выше пример написан в Groovy, у меня нет оснований полагать, что такое же поведение не будет отображаться эквивалентным Java-кодом.
Эти DTO генерируются JAXB (который генерирует "access", а не "get" accessor for booleans), поэтому я не могу переименовать аксессоров. Я использую Dozer 5.3.2.
Ответы
Ответ 1
Может быть, вы можете использовать пользовательский метод getter для его использования.
здесь s пример сопоставления (записать его в файл отображения дюз)
<mapping>
<class-a>ProductDto</class-a>
<class-b>ProductCommand</class-b>
<field>
<a get-method="isFoo">foo</a>
<b>foo</b>
</field>
</mapping>
Итак, теперь dozer будет использовать isFoo вместо предопределенного getFoo.
Надеюсь, что это работает для вас.:)
Ответ 2
Генерация методов "является" для класса Boolean wrapper является ошибкой в JAXB, см. Java Beans, BeanUtils и класс Boolean wrapper и http://java.net/jira/browse/JAXB-131 для деталей. Кажется, исправлено в jaxb 2.1.13
Ответ 3
Это ошибка в JAXB, у small-b boolean
должна быть isFoo()
. Вы можете использовать опцию -enableIntrospection с более поздними версиями JAXB или использовать старый логический модуль getter xjc http://fisheye5.cenqua.com/browse/~raw,r=MAIN/jaxb2-commons/www/boolean-getter/index.html
Ответ 4
Существует также другой способ достижения правильного отображения бульдозера (самый чистый, на мой взгляд):
<mapping>
<class-a>ProductDto</class-a>
<class-b>ProductCommand</class-b>
<field>
<a is-accessible="true">foo</a>
<b is-accessible="true">foo</b>
</field>
</mapping>
ИЛИ как уже упоминалось ранее:
<mapping>
<class-a>ProductDto</class-a>
<class-b>ProductCommand</class-b>
<field>
<a get-method="isFoo">foo</a>
<b>foo</b>
</field>
</mapping>