dozer布尔属性映射
看来如果该属性的访问者被定义为isProperty()
而不是getProperty()
,Dozer将不会映射布尔属性。dozer布尔属性映射
以下Groovy脚本说明了这个问题:
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生成的(它产生一个“is”存取器,而不是一个“获取”布尔值的存取器),所以我不能重命名存取器。我正在使用Dozer 5.3.2。
为布尔包装类生成“is”方法是JAXB中的一个错误,有关详细信息,请参阅Java Beans, BeanUtils, and the Boolean wrapper class和http://java.net/jira/browse/JAXB-131。似乎在jaxb中被修复2.1.13
这是JAXB中的一个bug,小-b boolean
应该有isFoo()
。您可以在更高版本的JAXB中使用-enableIntrospection选项,也可以使用老式的布尔型getter xjc插件
谢谢,任何想法,我可以找到这个插件(上面的链接不工作),以及我如何使用它与蚂蚁'wsimport'任务? – 2011-04-27 12:42:00
对不起,搞砸了链接。现在修复。 – artbristol 2011-04-27 12:55:09
恐怕我和Maven一起使用 – artbristol 2011-04-27 12:56:28
也许您可以使用自定义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>
所以现在推土机将使用而不是预定义的getFoo isFoo。 希望这对你有用。 :)
还有是实现正确的推土机映射(最干净的在我看来)的另一种方式:
<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>
是否使用JAXB来通过任何机会生成你的DTO? – artbristol 2011-04-27 10:49:05
是的,我有,有什么办法可以让它产生访问? – 2011-04-27 10:59:33
注意,当'is'方法的类型为'Boolean'时,Dozer只有这种方式 - 它将'boolean isFoo()'方法映射为罚款。 – 2012-04-06 15:20:05