2011-04-27 185 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>