2016-03-29 6 views
0

Ich habe einen SOAP Webservice implementiert und habe ihn erfolgreich mit SOAP UI getestet. Jetzt möchte ich die Client-Klassen mit Netbeans wsimport per URL erzeugen (Glassfish mit Webservice ist natürlich). Die Generierung wird erfolgreich ausgeführt, aber ich kann die Parameter RecommendationRequest -complextype nicht ändern. Das ist mein Kundencode:Kann SOAP-Client Request Parameter von generierten Klassen nicht ändern

RecommendationService service = new RecommendationService(); 
ShitstormRec recommenderPort = service.getRecommenderPort(); 

ObjectFactory factory = new ObjectFactory(); 
Goal g1 = factory.createGoal(); // runs 
     g1.setGoal("cost"); // runs perfectly, can set the value 
     g1.setPrio(1); // runs perfectly, can set the value 

RecommendationRequest request = factory.createRecommendationRequest(); 
     request.setVariables // no setter was generated, can't use any setters!!! 
recommenderPort.getRecommendation(request); // so i can't send a meaningful request with adjusted parameters, because of missing generated setter-Methods from request. 

Wie kann das sein? Jedes Objekt funktioniert gut, aber nur das wichtigste Argument kann sich nicht ändern. Das sind meine server Klassen:

Das ist meine WebService-Schnittstelle:

@WebService(name = "ShitstormRec", 
     targetNamespace = "http://shitstormrec.org") 
public interface IRecommendationService { 

    @WebMethod 
    @WebResult(name = "recommendations") 
    public List<Recommendation> getRecommendation(
      @WebParam(name = "recommendationRequest") RecommendationRequest request); 

    @WebMethod 
    @WebResult(name = "say") 
    public String sayCiao(); 
} 

Umsetzung des Web-Service:

@WebService(serviceName = "RecommendationService", 
     portName = "RecommenderPort", 
     endpointInterface = "org.andy.services.IRecommendationService") 
public class RecommendationService implements IRecommendationService { 

    private Recommender recommender = new Recommender(); 

    @Override 
    public List<Recommendation> getRecommendation(RecommendationRequest request) { 
     return recommender.recommend(request); 
    } 

    @Override 
    public String sayCiao() { 
     return "ciao"; 
    } 

} 

Das serverseitige Ziel-Objekt:

@XmlRootElement(name = "goal") 
public class Goal implements Serializable { 

    private int prio; 
    private String goal; 

    public Goal() { 
    } 

    public int getPrio() { 
     return prio; 
    } 

    public void setPrio(int prio) { 
     this.prio = prio; 
    } 

    public String getGoal() { 
     return goal; 
    } 

    public void setGoal(String goal) { 
     this.goal = goal; 
    } 

} 

Das serverseitige Objekt, für das kein Setter für generierte Clientklassen verfügbar ist:

@XmlRootElement(name = "recommendationRequest") 
public class RecommendationRequest implements Serializable { 

    private List<ProcessVariable> variables; 
    private List<Goal> goals; 

    public RecommendationRequest() { 
    } 

    public RecommendationRequest(List<ProcessVariable> variables, List<Goal> goals) { 
     this.variables = variables; 
     this.goals = goals; 
    } 

    public List<ProcessVariable> getVariables() { 
     return variables; 
    } 

    public void setVariables(List<ProcessVariable> variables) { 
     this.variables = variables; 
    } 

    public List<Goal> getGoals() { 
     return goals; 
    } 

    public void setGoals(List<Goal> goals) { 
     this.goals = goals; 
    } 

} 

Die wsdl:

<definitions targetNamespace="http://services.andy.org/" name="RecommendationService"> 
    <import namespace="http://shitstormrec.org" location="http://localhost:9090/ShitstormRec/RecommendationService?wsdl=1"/> 
    <binding name="RecommenderPortBinding" type="ns1:ShitstormRec"> 
     <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> 
     <operation name="getRecommendation"> 
      <soap:operation soapAction=""/> 
      <input> 
       <soap:body use="literal"/> 
      </input> 
      <output> 
       <soap:body use="literal"/> 
      </output> 
     </operation> 
     <operation name="sayCiao"> 
      <soap:operation soapAction=""/> 
      <input> 
       <soap:body use="literal"/> 
      </input> 
      <output> 
       <soap:body use="literal"/> 
      </output> 
     </operation> 
    </binding> 
    <service name="RecommendationService"> 
     <port name="RecommenderPort" binding="tns:RecommenderPortBinding"> 
      <soap:address location="http://localhost:9090/ShitstormRec/RecommendationService"/> 
     </port> 
    </service> 
</definitions> 

Die referenzierte Wsdl von oben:

<!-- Published by JAX-WS RI (http://jax-ws.java.net). RI's version is Metro/2.3.2-b608 (trunk-7979; 2015-01-21T12:50:19+0000) JAXWS-RI/2.2.11-b150120.1832 JAXWS-API/2.2.12 JAXB-RI/2.2.12-b141219.1637 JAXB-API/2.2.13-b141020.1521 svn-revision#unknown. 
--><!-- Generated by JAX-WS RI (http://jax-ws.java.net). RI's version is Metro/2.3.2-b608 (trunk-7979; 2015-01-21T12:50:19+0000) JAXWS-RI/2.2.11-b150120.1832 JAXWS-API/2.2.12 JAXB-RI/2.2.12-b141219.1637 JAXB-API/2.2.13-b141020.1521 svn-revision#unknown. 
--><definitions targetNamespace="http://shitstormrec.org"> 
    <types> 
     <xsd:schema> 
      <xsd:import namespace="http://shitstormrec.org" schemaLocation="http://localhost:9090/ShitstormRec/RecommendationService?xsd=1"/> 
     </xsd:schema> 
    </types> 
    <message name="getRecommendation"> 
     <part name="parameters" element="tns:getRecommendation"/> 
    </message> 
    <message name="getRecommendationResponse"> 
     <part name="parameters" element="tns:getRecommendationResponse"/> 
    </message> 
    <message name="sayCiao"> 
     <part name="parameters" element="tns:sayCiao"/> 
    </message> 
    <message name="sayCiaoResponse"> 
     <part name="parameters" element="tns:sayCiaoResponse"/> 
    </message> 
    <portType name="ShitstormRec"> 
     <operation name="getRecommendation"> 
      <input ns1:Action="http://shitstormrec.org/ShitstormRec/getRecommendationRequest" message="tns:getRecommendation"/> 
      <output ns2:Action="http://shitstormrec.org/ShitstormRec/getRecommendationResponse" message="tns:getRecommendationResponse"/> 
     </operation> 
     <operation name="sayCiao"> 
      <input ns3:Action="http://shitstormrec.org/ShitstormRec/sayCiaoRequest" message="tns:sayCiao"/> 
      <output ns4:Action="http://shitstormrec.org/ShitstormRec/sayCiaoResponse" message="tns:sayCiaoResponse"/> 
     </operation> 
    </portType> 
</definitions> 

Das XSD-Schema:

<!-- Published by JAX-WS RI (http://jax-ws.java.net). RI's version is Metro/2.3.2-b608 (trunk-7979; 2015-01-21T12:50:19+0000) JAXWS-RI/2.2.11-b150120.1832 JAXWS-API/2.2.12 JAXB-RI/2.2.12-b141219.1637 JAXB-API/2.2.13-b141020.1521 svn-revision#unknown. 
--><xs:schema version="1.0" targetNamespace="http://shitstormrec.org"> 
    <xs:element name="getRecommendation" type="tns:getRecommendation"/> 
    <xs:element name="getRecommendationResponse" type="tns:getRecommendationResponse"/> 
    <xs:element name="goal" type="tns:goal"/> 
    <xs:element name="processVariable" type="tns:processVariable"/> 
    <xs:element name="recommendation" type="tns:recommendation"/> 
    <xs:element name="recommendationRequest" type="tns:recommendationRequest"/> 
    <xs:element name="sayCiao" type="tns:sayCiao"/> 
    <xs:element name="sayCiaoResponse" type="tns:sayCiaoResponse"/> 
    <xs:complexType name="sayCiao"> 
     <xs:sequence/> 
    </xs:complexType> 
    <xs:complexType name="sayCiaoResponse"> 
     <xs:sequence> 
      <xs:element name="say" type="xs:string" minOccurs="0"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="getRecommendation"> 
     <xs:sequence> 
      <xs:element name="recommendationRequest" type="tns:recommendationRequest" minOccurs="0"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="recommendationRequest"> 
     <xs:sequence> 
      <xs:element name="goals" type="tns:goal" nillable="true" minOccurs="0" maxOccurs="unbounded"/> 
      <xs:element name="variables" type="tns:processVariable" nillable="true" minOccurs="0" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="goal"> 
     <xs:sequence> 
      <xs:element name="goal" type="xs:string" minOccurs="0"/> 
      <xs:element name="prio" type="xs:int"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="processVariable"> 
     <xs:sequence> 
      <xs:element name="name" type="xs:string" minOccurs="0"/> 
      <xs:element name="type" type="tns:variableType" minOccurs="0"/> 
      <xs:element name="value" type="xs:string" minOccurs="0"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="getRecommendationResponse"> 
     <xs:sequence> 
      <xs:element name="recommendations" type="tns:recommendation" minOccurs="0" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="recommendation"> 
     <xs:sequence> 
      <xs:element name="benefit" type="xs:int"/> 
      <xs:element name="information" type="xs:string" minOccurs="0"/> 
      <xs:element name="taskName" type="xs:string" minOccurs="0"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:simpleType name="variableType"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="STRING"/> 
      <xs:enumeration value="INTEGER"/> 
      <xs:enumeration value="DOUBLE"/> 
      <xs:enumeration value="OBJECT"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

ich einen Fehler gemacht?

Vielen Dank für Ihre Hilfe =)

Antwort

0

Ich habe die Lösung gefunden. Alles ist korrekt, war nur ein Denkfehler. Ich brauche nur die Variablenliste und füge etwas hinzu. Ich war verwirrt über die fehlenden Setter.

RecommendationRequest request = factory.createRecommendationRequest(); 
     request.setVariables // setter was not available 

// Instead i used: 
request.getVariables().add(object_to_add)