2012-06-22 4 views
2

webservice를 기반으로 jaxws 클라이언트를 생성 중입니다. Jaxb는 기본 유형 대신 java.lang.Boolean을 사용하여 부울을 생성합니다. 이 외에도 Bean의 is() 명명 규칙을 생성합니다. 내가 체크 박스에 (예를 들어 isOptional()) 부울 연결하려고하면JSF 2 체크 박스와 부울 getter

그러나, 다음과 같은 예외가 발생합니다 :

내 구글 기술은 JSF와 함께 잘 작동하는지 저를 알렸다 한
value="#{property.optional}": Property 'optional' not readable on type java.lang.Boolean 

:

boolean isOptional() 
boolean getOptional() 
Boolean getOptional() 

하지만 수동으로 콩을 업데이트 가능하지 않다 그러나

Boolean isOptional() 

와 크기와 webservices의 양으로 인해 jsf가 java.lang.Boolean isOptional()을 제대로 사용하도록하는 방법이 있습니까? 또는 어떻게 든 생성 시간에 jaxb 바인딩 파일에서 속성을 정의하여 "getOptional()"을 생성 할 수 있습니까? 다음은 (!) 참고에

은 수행 업무 : 그것은 세터를 찾을 수 없기 때문에 실제로 아마도 값을 업데이트 할 수 없습니다 그러나

<h:selectBooleanCheckbox value="#{property.isOptional()}"/> 

.

편집 : 나는 최신 JDK 7을 실행하고있어, "자바 -version"의 출력은 :

java version "1.7.0_05" 
Java(TM) SE Runtime Environment (build 1.7.0_05-b05) 
Java HotSpot(TM) Client VM (build 23.1-b03, mixed mode, sharing) 

"wsimport의의 -version"의 출력 :

JAX-WS RI 2.2.4-b01 

가 생성 코드 :

public Boolean isOptional() { 
    return optional; 
} 

답변

4

Jaxb는 기본 유형 대신 java.lang.Boolean을 사용하여 부울을 생성합니다. 이 외에도 Bean의 is() 명명 규칙을 생성합니다. java.lang.Booleanis 게터 접두사를 사용

JAXB의 알려진 큰 실수였다. It has been fixed in version 2.1.13은 이미 2010 년 4 월에 출시되었습니다. 도서관을 최신으로 유지하십시오.

일부 배경에 대해서는 this blog article도 참조하십시오.

당신이 하나 개를 위로 것에 대해 일에 손에있어 2006

위대한 JAXB API 큰 실수

년 9 월 15 일. 문서가 교과서만큼 두꺼울 때 명세를 따르지 않는 소프트웨어를 작성하는 것이 중요합니다. 예를 들어 W3C에서 만든 모든 것을 생각해보십시오. 그러나, 특히 그것이 가장 잘 알려진 부분 일 때 당신이 따를 수없는 자신의 스펙 일 때 그것은 정말로 나쁩니다. 맞습니다. Sun은 JAXB 2.0 API를 만들 때 자신의 사양에 마일을 놓쳤습니다. JAXB 2.0 컴파일러 (XJC)는 java.lang.Boolean 속성에 대한 getter 메서드를 생성 할 때 "get"대신 "is"라는 접두사를 잘못 사용합니다.JavaBean 사양에서는 원시 부울에 대한 읽기 메소드가 대체 "is"접두어를 사용할 수 있다고 명시하지만이 유연성은 부울 래퍼 대응 부분으로 확장되지 않습니다.

8.3.2 부울 속성

는 또한, 부울 속성에 대해, 우리는 getter 메소드 패턴 일치시킬 수 있습니다 :

public boolean is(); 

을이 "있다"방법이 될 수있다 "get"메소드 대신 제공되거나 "get"메소드 외에도 제공 될 수 있습니다. 두 경우 모두 부울 속성에 "is"메서드가 있으면 "is"메서드를 사용하여 속성 값을 읽습니다.

예 부울 속성이 될 수 있습니다

public boolean isMarsupial(); 
public void setMarsupial(boolean m); 

JAXB 코드 생성 프레임 워크 및 코드 생성 프레임 워크 뒤에 아이디어는 코드로 "사용되도록되어 있음을 감안할 때 is "이고 이후에 수정되지 않는다면, 이것은 꽤 큰"죄송합니다 (oops) "입니다. 이 문제가보고되었지만 Sun의 응답은 "너무 늦었습니다."

이 동작은 사양의 영향을받으며, 불행하게도 사양이 변경 되기에는 너무 늦었습니다.

자동 복싱 덕분에 사용자 경험면에서 이것이 사람에게 실질적인 문제가되지는 않을 것이라고 생각합니다. Introspector를 사용하고 있는데 속성이 누락되었습니다. 너무 늦습니까? 진짜 문제는 아닌가? 부러 졌어. 그것을 고정 시키십시오! 나는 또한 프레임 워크에 영향을 미치지 않는다는 단순한 진술을 싫어한다. 음, 그렇습니다. 다른 프로젝트가 사양 (최대 절전, 스프링, 얼굴 등)을 준수한다고 생각하면

업데이트 : Stevo Slavic이 JAXB 2.1.13에서 수정되었다고 전합니다. 자세한 내용은 JAXB-131을 참조하십시오. 네!

여기 JSF/EL에 문제가 없습니다. JavaBeans spec을 올바르게 준수하고 있습니다.

+1

저는 jaxb 라이브러리에 올바른 wsimport를 실행하고 있습니까? 자세한 내용은 원래 질문을 참조하십시오. – nablex

3

왜 최신 JAXB 버전이 여전히 잘못된 방법을 생성하는지 모르겠지만 마침내 wsimport 호출에 "-B-enableIntrospection"(http://jaxb.java.net/2.2.4/docs/xjc.html)을 추가하여 수정했습니다. 그 결과는 다음과 같습니다.

public Boolean getOptional() { 
    return optional; 
} 
+0

감사합니다. 이것은 매력처럼 작동했습니다. – Senstive

관련 문제