2011-04-27 135 views
11

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

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

这些DTO是由JAXB生成的(它产生一个“is”存取器,而不是一个“获取”布尔值的存取器),所以我不能重命名存取器。我正在使用Dozer 5.3.2。

+0

是否使用JAXB来通过任何机会生成你的DTO? – artbristol 2011-04-27 10:49:05

+0

是的,我有,有什么办法可以让它产生访问? – 2011-04-27 10:59:33

+0

注意,当'is'方法的类型为'Boolean'时,Dozer只有这种方式 - 它将'boolean isFoo()'方法映射为罚款。 – 2012-04-06 15:20:05

回答

3

这是JAXB中的一个bug,小-b boolean应该有isFoo()。您可以在更高版本的JAXB中使用-enableIntrospection选项,也可以使用老式的布尔型getter xjc插件​​

+0

谢谢,任何想法,我可以找到这个插件(上面的链接不工作),以及我如何使用它与蚂蚁'wsimport'任务? – 2011-04-27 12:42:00

+0

对不起,搞砸了链接。现在修复。 – artbristol 2011-04-27 12:55:09

+0

恐怕我和Maven一起使用 – artbristol 2011-04-27 12:56:28

8

也许您可以使用自定义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。 希望这对你有用。 :)

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>