2011-04-27 4 views
11

Dozer는 해당 등록 정보 접근자가 getProperty()이 아닌 isProperty()으로 정의 된 경우 부울 등록 정보를 매핑하지 않는 것으로 보입니다.도저 부울 등록 정보 매핑

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 (부울에 대한 "get"접근자가 아니라 "is"접근자를 생성 함)에 의해 생성되므로 접근 자의 이름을 바꿀 수 없습니다. Dozer 5.3.2를 사용하고 있습니다.

+0

것은 당신이 JAXB로를 사용하고이 언제든지 DTO를 생성 할 수 있습니까? – artbristol

+0

네, 접근자를 생성 할 수있는 방법이 있습니까? –

+0

Dozer는'is' 메소드가'Boolean' 타입을 가지고있을 때만 이런 식으로 동작합니다.'boolean isFoo()'메소드를 잘 매핑합니다. –

답변

3

이것은 JAXB의 버그입니다. booleanisFoo()이어야합니다. 최신 버전의 JAXB에서 -enableIntrospection 옵션을 사용하거나 오래된 부울 getter xjc 플러그인을 사용할 수 있습니다. http://fisheye5.cenqua.com/browse/~raw,r=MAIN/jaxb2-commons/www/boolean-getter/index.html

+0

고마워,이 플러그인 (위의 링크가 작동하지 않음)을 발견하고 ant 'wsimport' 작업과 함께 사용하는 방법을 알고 싶습니다. –

+0

죄송합니다. 링크를 망쳤습니다. 이제 해결되었습니다. – artbristol

+0

Maven과 함께 사용하는 것이 두려웠습니다 – artbristol

8

사용자 정의 게터 방법을 사용하여 사용할 수 있습니다.

여기 예를 매핑 (도저 매핑 파일에 쓰기)

<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>