如果该属性的访问者被定义为isProperty()
而不是getProperty()
,则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”访问器,而不是booleans的“get”访问器),因此我无法重命名访问器。我正在使用Dozer 5.3.2。
答案 0 :(得分:9)
可能您可以使用自定义getter方法来使用它。
这里是示例映射(在dozer-mapping文件中写入)
<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。 希望这对你有用。 :)
答案 1 :(得分:7)
生成布尔包装类的“is”方法是JAXB中的一个错误,有关详细信息,请参阅Java Beans, BeanUtils, and the Boolean wrapper class和http://java.net/jira/browse/JAXB-131。似乎在jaxb 2.1.13中修复了
答案 2 :(得分:3)
这是JAXB中的一个错误,小b boolean
应该有isFoo()
。您可以在更高版本的JAXB中使用-enableIntrospection选项,也可以使用oldish boolean getter xjc插件http://fisheye5.cenqua.com/browse/~raw,r=MAIN/jaxb2-commons/www/boolean-getter/index.html
答案 3 :(得分:0)
还有另一种方法可以实现正确的推土机映射(我认为最干净):
<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>