2012-09-20 13 views
23

Używam wtyczki Apache CXFcxf-codegen-pluginMaven do generowania źródeł z pliku WSDL. Problem polega na tym, że generuję JAXBElement<String> wygenerowany zamiast String. Dodałem plik jaxb-bindings.xml który wygląda tak:JAXB generujący JAXBElement <String> zamiast ciągu

<jaxb:bindings version="2.1" 
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"> 
    <jaxb:globalBindings generateElementProperty="false"/> 
</jaxb:bindings> 

To powinno zapobiec JAXB wygenerować JAXBElement<String>. Ale to nie działa, nadal mam JAXBElement<String> wygenerowany zamiast String.

Moja Maven Wtyczka wygląda następująco:

<plugin> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-codegen-plugin</artifactId> 
    <version>${cxf.runtime.version}</version> 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.cxf</groupId> 
      <artifactId>cxf-rt-bindings-soap</artifactId> 
      <version>${cxf.runtime.version}</version> 
     </dependency> 
    </dependencies> 
    <executions> 
     <execution> 
      <id>generate-jaxb</id> 
      <phase>generate-sources</phase> 
      <configuration> 
       <additionalJvmArgs>-Dfile.encoding=UTF8</additionalJvmArgs> 
       <wsdlOptions> 
        <wsdlOption> 
         <wsdl>src/main/resources/wsdl/Cubiks.wsdl</wsdl> 
         <extraargs> 
          <extraarg>-b</extraarg> 
          <extraarg>${basedir}/jaxb-bindings.xml</extraarg> 
          <extraarg>-b</extraarg> 
          <extraarg>${basedir}/jaxws-bindings.xml</extraarg> 
          <extraarg>-exsh</extraarg> 
          <extraarg>true</extraarg> 
          <extraarg>-wsdlLocation</extraarg> 
          <extraarg></extraarg> 
         </extraargs> 
        </wsdlOption> 
        <wsdlOption> 
         <wsdl>src/main/resources/wsdl/CubiksCallBackService.wsdl</wsdl> 
         <extraargs> 
          <extraarg>-b</extraarg> 
          <extraarg>${basedir}/jaxws-bindings.xml</extraarg> 
          <extraarg>-b</extraarg> 
          <extraarg>${basedir}/jaxb-bindings.xml</extraarg> 
          <extraarg>-exsh</extraarg> 
          <extraarg>true</extraarg> 
          <extraarg>-p</extraarg> 
          <extraarg>com.cubiks.ws.callback</extraarg> 
          <extraarg>-wsdlLocation</extraarg> 
          <extraarg></extraarg> 
         </extraargs> 
        </wsdlOption> 
       </wsdlOptions> 
      </configuration> 
      <goals> 
       <goal>wsdl2java</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

CXF wersja jest 2.6.0. Czy ktoś wie, gdzie może być problem?

EDIT

XSD jest bardzo duże. Jest to element, który generuje JAXBElement<String>

<xs:complexType name="ServiceResponse"> 
    <xs:sequence> 
     <xs:element minOccurs="0" name="RequestStatus" type="tns:RequestStatus"/> 
     <xs:element minOccurs="0" name="RequestStatusDescription" nillable="true" type="xs:string"/> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:element name="ServiceResponse" nillable="true" type="tns:ServiceResponse"/> 

a wygenerowany źródłem jest:

@XmlElementRef(name = "RequestStatusDescription", namespace = "http://www.cubiksonline.com/2009/08/AssessmentProvider", type = JAXBElement.class) 
protected JAXBElement<String> requestStatusDescription; 
+1

Plz dostarcza plik wsdl, a jeśli masz, xsd – popfalushi

Odpowiedz

34

Co musiałem zrobić, to owinąć jaxb:globalBindings innym jaxb:bindings.

<jaxb:bindings version="2.0" 
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"> 
    <jaxb:bindings> 
     <jaxb:globalBindings generateElementProperty="false"/> 
    </jaxb:bindings> 
</jaxb:bindings> 

Teraz wszystko działa, nie ma JAXBElement<String> generowane więcej.

+1

Czy ktoś może wyjaśnić, dlaczego to działa? –

+0

Z przyjemnością informujemy, że to rozwiązanie działa również w JDeveloper. Po prostu utwórz plik xml, a następnie przekaż go w kreatorze na etapie określania adresu URL/lokalizacji pliku WSDL. – webuster

+0

To działało również w NetBeans 8.2. Kliknij prawym przyciskiem myszy usługę i "edytuj atrybuty usługi internetowej". Następnie przejdź do zakładki "Dostosowywanie WSDL", a na dole w "Zewnętrzne pliki wiążące" dodaj ten plik i odtwórz go ponownie. Wszystkie ciągi rozwiązane jako ciąg. Czołgi! – Darrelk

4

myślę chcesz dodać w swoim JAXB-binding.xml:

<jaxb:bindings ... xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"> 
    <jaxb:globalBindings generateElementProperty="false"> 
     <xjc:simple /> 
     <!-- ... --> 
    </jaxb:globalBindings> 
</jaxb:bindings> 
+0

Próbuję go dodać, ale otrzymuję: com.sun.istack.SAXParseException2: Dostosowanie "xjc: simple" nie jest powiązane z żadnym elementem schematu. –

+0

Udało mi się poprawnie, ale wciąż tak samo. Wygenerowano JAXBElement . –

+2

Właśnie wypróbowałem WS do przetestowania, jest to atrybut "generateElementProperty =" false "', który omija opakowanie 'JAXBElement' w moim przypadku. Przepraszamy za hałas. –

8

Można nie mają możliwości łączenia i minoccurs razem. Usuń minoccurs, ponieważ i tak nie ma sensu dla ciągów.

+0

I dlaczego nie mogę mieć ich razem? Przy okazji plik wsdl jest dostarczany przez klienta, nie stworzyliśmy go. Rozumiem, że nie mają one sensu, ale nie jest to dla mnie decyzja, czy je usunąć, czy nie. –

+5

Jeśli schemat ma oba, potrzebujesz JAXBElement, aby móc odróżnić przypadki, w których brakuje elementu XML (dozwolone przez minOccurs) i gdzie jest on obecny, ale 'xsi: zero'. Jeśli schemat zezwalał tylko na jeden lub drugi, nie byłby potrzebny JAXBElement, ponieważ wystarczałaby wartość właściwości "null". –

+3

[Ten post] (http://cxf.547215.n5.nabble.com/JAXBElement-in-generated-java-classes-tp4933735p4934002.html) wyjaśnia to ładnie. –