2013-01-03 4 views
1

서버 측에서 JAX-WS를 사용하여 웹 서비스 작업을 완료했습니다. 많은 도메인 객체에서 나는 JAXB를 사용하여 XML 파일의 서비스로의 비 정렬 화를 돕기 위해 @XmlRootElement을 사용했다. 모든 것이 잘되었고 결과물은 SoapUI를 사용하여 보았을 것으로 예상됩니다.wsimport가 @XmlRootElement 주석을 갖는 서버 객체에 문제가있는 이유는 무엇입니까?

그러나 wsimport를 사용하여 클라이언트를 만들 때 (다른 개발자의 편리한 DAO로서) 클라이언트 통합 테스트 클래스에서 NullPointerExceptions가 발생하기 시작했습니다.

webservice에 대한 호출이 제대로 작동하고 응답이 클라이언트에 수신되었지만 더 복잡한 객체는 null입니다. String과 같은 단순한 속성은 사용 가능한 데이터로 가득 차 있지만 큰 객체는 반환하지 않았습니다.

간단한 문자열을 사용하여 서비스를 재생성하고 더 복잡한 개체로 마이그레이션하는 과정을 반복하면서 클라이언트가 @XmlRootElement으로 서버에 선언 된 개체를 받았을 때 null 인 개체를 발견했습니다. 서버 오브젝트에 @XmlRootElement 주석이 없으면 클라이언트는 모든 복잡한 데이터를 수신했습니다.

초기에 @XmlRootElement이 부족하면 서버의 데이터를 언 마샬링 할 때 적합했지만, this answer은 나를 도와주었습니다.

@XmlRootElement 어노테이션 (서버상의!) 때문에 웹 서비스 응답의 마샬링 해제시 wsimport 클라이언트가 자동으로 실패하는 현상이 걱정됩니다. 이 경우 나는 양측을 통제 할 수 있었고 그것에 대해 뭔가 할 수 있었다. 그러나 서버를 제어 할 수 없다면 어떻게 될까요? wsimport가 생성 한 코드로 어떻게 해결할 수 있습니까?

답변

1

답변을 찾거나 그 이유를 공유 할 것이라고 생각했습니다.

@XmlRootElement 주석은 일반 JAXB 바인딩 유용하지만, 객체 (그 결과 XML은)는 SOAP 응답으로 포장 할 때 그들이 정확히에 따라 데이터의 WSDL의 표현과 일치하지 않을 가능성이 있습니다 다른 주석의 값 다음 다른 곳 WSDL가에 대한 참조를 포함

<xs:element name="foo" type="tns:FooType"/> 

하십시오 @WebMethod 메소드에 의해 반환되는 서버 클래스에 @XmlRootElement 주석으로

WSDL 같은 요소의 정의를 포함합니다

<xs:seqeunce> 
<xs:element maxOccurs="unbounded" minOccurs="0" ref="tns:foo"/> 
</xs:sequence> 

이 참조가 루트 요소의 의도를 혼동 할 수있다 @XmlRootElement 주석에 의해 발생 : 시퀀스 등의 요소 선언을 SOAP 응답의 실제 XML과 비교합니다.

대조적으로 서버 개체에서 @XmlRootElement 주석없이 생성 된 WSDL에는 <xs:element name="foo"/> 선언이 전혀 포함되어 있지 않습니다.

<xs:sequence> 
<xs:element maxOccurs="unbounded" minOccurs="0" name="foo" type="tns:FooType"/> 
</xs:sequence> 

이 아마 더 나은 경기는 SOAP 응답 XML이 표현되는 방식과 잘 wsimport 작업에 의해 생성 된 클래스에 XML의 비 정렬 화를 : 오히려 그 요소는 다음과 같이 설명한다.

JAX-WS 서비스에서 @XmlRootElement을 어떻게 사용합니까?

wsimport은 서비스에 의해 반환 된 XML의 유효성에 어느 정도 게으름을 처리하는 것처럼 보입니다. 교훈은 웹 서비스 방법을 설명하는 @WebResult 주석에 nametargetNamespace을 부지런히 사용하는 것입니다. @XmlRootElement 특수 효과는 내의 name과 일치해야합니다. 모두 일치하면 언 마샬링은 예상대로 발생합니다. 이러한 값이 일치하지 않으면 wsimport에 의해 생성되고 주석이 달린 스텁 된 클래스는 XML을 적절하게 사용할 수 없습니다.