2014-09-19 5 views
5

내가이 내부 스키마와 다른 스키마사용자 정의 Java는 JAXB 내가 컴파일을 실행하려고하면

을에서 동일한 이름을 가진 일부 요소와 WSDL 파일에서 받는다는와 JAXB와 클라이언트를 생성하기 위해 노력하고있어 wsimport의 패키지 I

Two declarations cause a collision in the ObjectFactory class. 

WSDL 스키마 : '다음 오류가 발생 해요 내가 요소의 이름을 바꾸는 시도

<wsdl:types> 
    <schema targetNamespace="http://ws.services" xmlns="http://www.w3.org/2001/XMLSchema">...</schema> 
    <schema targetNamespace="http://ws.models" xmlns="http://www.w3.org/2001/XMLSchema">...</schema> 
</wsdl:types> 

그 오류가 발생하지만 내 봄 클라이언트가 올바른 SOAP 메시지를받을 수 있지만 적절하게 응답 개체를 채우지 않습니다 (해당 특성은 모두 null입니다). 문제는 응답 클래스의 이름을 변경했을 때 생길 수 있으므로 모든 클래스의 원래 이름을 유지하면서 다른 패키지를 생성하려고합니다.

이렇게하기 위해 다음 바인딩 파일을 작성했지만 작동하지 않는다고 잘못 알고 있습니다.

bindings.xml 파일을 받는다는 파일에

<?xml version="1.0" encoding="UTF-8"?> 
<jaxb:bindings version="2.1" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" > 

<jaxb:bindings schemaLocation="mywsdl.wsdl#types?schema1" 
    node="/xs:schema[@targetNamespace='http://ws.services']"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="package1" /> 
     </jaxb:schemaBindings> 
</jaxb:bindings> 

<jaxb:bindings schemaLocation="mywsdl.wsdl#types?schema2" 
    node="/xs:schema[@targetNamespace='http://ws.models']"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="package2" /> 
     </jaxb:schemaBindings> 
</jaxb:bindings> 

</jaxb:bindings> 

내 구성 부분은 유용 단지의 경우, 다음입니다 :

<groupId>org.jvnet.jax-ws-commons</groupId> 
<artifactId>jaxws-maven-plugin</artifactId> 
<version>2.3</version> 
<executions> 
    <execution> 
     <goals> 
      <goal>wsimport</goal> 
     </goals> 
    </execution> 
</executions> 
<configuration> 
    <wsdlLocation>wsdl/mywsdl.wsdl</wsdlLocation> 
    <wsdlDirectory>src/main/resources/wsdl</wsdlDirectory> 
    <wsdlFiles> 
     <wsdlFile>mywsdl.wsdl</wsdlFile> 
    </wsdlFiles> 
    <bindingDirectory>src/main/resources/wsdl</bindingDirectory> 
    <bindingFiles> 
     <bindingFile>bindings.xml</bindingFile> 
    </bindingFiles> 
    <packageName>original.package</packageName> 
    <sourceDestDir>${basedir}/src/main/java</sourceDestDir> 
</configuration> 

나는이 바인딩 파일을 컴파일 할 때 , 같은 오류가 나타납니다. 그래서 나는 아마도 그것이 옳지 않을 것이라고 생각합니다.

실수가 있습니까?

감사합니다.

+0

그냥 팁 : SRC/잭스 - WS에 모든 바인딩 파일을 배치 완전히 경우는 "bindingFiles"구성 섹션을 제거 할 수 있습니다! 그러면 자동으로 jaxws-maven-plugin에 의해 선택됩니다. – headcr4sh

답변

7

내 경험에 비추어 볼 때 2 개의 바인딩 파일 (각 WSDL 파일에 하나씩)을 만드는 것이 가장 좋습니다. 그에 따라 pom.xml 파일을 업데이트하고 바인딩 파일의 루트 요소는 잭스 - WS 있는지 확인 : 바인딩 (그리고 JAXB! 바인딩)

몇 가지 힌트 :

  1. 하면 설정해야합니다 "wsdlLocation"특성이 올바르게! 상대 경로를 사용하여 WSDL 파일을 가리켜 야합니다!
  2. jaxws : 패키지는 생성 된 서비스 클래스에 사용될 패키지를 결정합니다. (@WebService로 주석 처리 된 항목)
  3. 원하는대로 wrapperStyle 및 asyncMapping을 사용 또는 사용하지 않도록 설정합니다. ;-) "package1"에 대한 파일을 바인딩

예 :

<?xml version="1.0" encoding="UTF-8"?> 

    <jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
        xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        wsdlLocation="mywsdl.wsdl" 
        version="2.0"> 

     <jaxws:package name="package1"/> 
     <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle> 
     <jaxws:enableAsyncMapping>true</jaxws:enableAsyncMapping> 

     <jaxws:bindings node="//wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='http://ws.services']"> 
      <jaxb:schemaBindings> 
       <jaxb:package name="package1"/> 
      </jaxb:schemaBindings> 
     </jaxws:bindings> 

    </jaxws:bindings> 
+1

대단히 감사합니다!, 트릭을했습니다. 중요!, 내가' original.package'을 제거한 후에 플러그인이 pom 파일의 이전 패키지를 사용했기 때문에 처음으로 컴파일했을 때 플러그인이 새 패키지 구성을 무시했을 때 다른 패키지가 생성되었습니다. 하나...Spring은 내 응답 객체를 올바르게 채우지 못하고 있으며, 응답 메시지 SOAP 메시지가 정확하다는 것을 내 로거에서 볼 수 있으므로이 솔루션이 내 주요 문제를 해결하지 못했다. – maqjav

관련 문제