dozer布尔属性映射

时间:2011-04-27 10:44:18

标签: java groovy dozer

如果该属性的访问者被定义为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映射文件中设置一个标志/选项,指示它使用isget访问器来表示布尔属性?或者,我可以为每个布尔属性添加自定义规则,但这不是很吸引人。

虽然上面的例子是用Groovy编写的,但我没有理由相信相同的Java代码不会表现出同样的行为。

这些DTO是由JAXB生成的(它生成“is”访问器,而不是booleans的“get”访问器),因此我无法重命名访问器。我正在使用Dozer 5.3.2。

4 个答案:

答案 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 classhttp://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>