Warum generierte Klassen von wsimport erfordert JAXBElement<ClassName> Parameter?
Ich habe eine WSDL-Datei, die von einem Axis2 Web-Service. Wenn ich Generiere eine client-stub mit wsimport
angesichts der WSDL-Datei, die resultierenden Klassen erfordern JAXBElement
Parameter. Warum ist es so?
Beispiel-Methode von einem der Generierten Klassen:
JAXBElement<DataBean> value;
public void setValue(JAXBElement<DataBean> value)
{
this.value = ((JAXBElement<DataBean>) value);
}
Ich gehe davon aus, dass es wie folgt Aussehen (ohne die JAXBElement):
DataBean value;
public void setValue(DataBean value)
{
this.value= (DataBean) value;
}
Den tutorials, die ich sah auf dem Netz nicht die Klassen zu JAXBElement. Was könnte das problem sein? Bitte beachten Sie, dass der server eine Axis2 web service und die WSDL-Datei automatisch generiert wird, von Axis2. Die Annahme ist, ich habe keine Kontrolle über den server.
Wie kann ich es machen das in einer Weise, dass wsimport
nicht konvertieren, die Parameter zu JAXBElements?
Unten ist ein Auszug aus der WSDL-Datei: (ignoriert ich einige der tags, um nur die wesentlichen tags)
<xs:element name="getData">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="getData" nillable="true" type="ax220:getData"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="getData">
<xs:sequence>
<xs:element minOccurs="0" name="value" nillable="true" type="ax219:DataBean"/>
</xs:sequence>
</xs:complexType>
<wsdl:message name="getDataRequest">
<wsdl:part name="parameters" element="ns:getData"/>
</wsdl:message>
<wsdl:message name="getDataResponse">
<wsdl:part name="parameters" element="ns:getDataResponse"/>
</wsdl:message>
<wsdl:operation name="getData">
<wsdl:input message="ns:getDataRequest" wsaw:Action="urn:getData"/>
<wsdl:output message="ns:getDataResponse" wsaw:Action="urn:getDataResponse"/>
</wsdl:operation>
<wsdl:operation name="getData">
<soap:operation soapAction="urn:getData" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getData">
<soap12:operation soapAction="urn:getData" style="document"/>
<wsdl:input>
<soap12:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap12:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getData">
<http:operation location="getData"/>
<wsdl:input>
<mime:content type="text/xml" part="parameters"/>
</wsdl:input>
<wsdl:output>
<mime:content type="text/xml" part="parameters"/>
</wsdl:output>
</wsdl:operation>
- Kannst du die Teile der WSDL-wo DataBean definiert ist und in einer Nachricht verwendet und den Betrieb?
- Ich veränderte meinen post enthalten die angeforderten Daten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beginnen mit: ich glaube nicht, dass dies getan werden kann. Das heißt, ich glaube nicht, dass man sagen kann wsimport generieren der Klassen unterschiedlich. Aber ich kann Ihnen sagen, wie ändern Sie die WSDL, die in einer Weise erzeugt, dass das schema anders und das könnte noch aktivieren, Sie zu sprechen, die service.
Nahm ich die type-Definitionen aus dem WSDL, angepasst den Namen des complexType-und fügte hinzu, die einen Typ für DataBean, die fehlte oben. Habe ich eingefügt, die zu einem schema zusammengestellt und das schema mit xjc, die JAXB-schema-Compilers, der verwendet wird, durch wsimport generieren von Klassen aus der Typ-Definitionen. Hier ist das schema:
Sie brauchen keine speziellen Optionen für den compiler, führen Sie einfach xjc und zeigen Sie es auf der schema-Datei, dann wird es kompilieren der Quelldateien.
Den generierten Klassen nicht verwenden
JAXBElement
als Parameter der Methode. Das ist, dass Sie wie folgt Aussehen:Warum ist das so? Ich entfernte die
nillable="true"
Attribute aus dem element-Definitionen, und dies hat den trick.nillable="true"
besagt, dass explizite null-Werte sind legal hier:Wenn Sie entfernen Sie dieses Attribut, wird Ihr code läuft in Probleme, wenn der service tatsächlich schreibt null-Werte drin. Aber nach all dem WSDL generiert wird und vielleicht Axis2 einfach der Meinung ist das nillable-sollte es aus irgendeinem Grund, obwohl die Umsetzung eigentlich nie verwendet. Wenn Sie Glück haben, ist es nicht und alles wird funktionieren, obwohl Sie verändert die WSDL.
Ich hoffe, das hilft! Wenn nicht, dann wenigstens ich habe etwas gelernt heute 😉
Als Lesen auf dieser Seite :
http://www.techdevtips.com/java/java-webservice-client-how-to-remove-jaxbelement
verwenden Sie eine data-binding-Datei mit diesem code :
und verwenden Sie es in Ihrem wsimport ant-task, indem Sie die binding-Attribut (oder -b-flag-argument, wenn Sie die runnable)
Prost 🙂