2017-08-29 3 views
0

Ich bin ein Neuling bei der Entwicklung von Web Services. Ich habe Java-Klassen von XSD mit dem Befehl xjc (Befehlszeile "xjc .... \ MySchema.xsd") erstellt.Implementierung von Java Web Service mit xfc

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Published by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. --> 
<s:schema elementFormDefault="qualified" targetNamespace="http://SAS.Servicios/" xmlns:s="http://www.w3.org/2001/XMLSchema"> 
    <s:element name="S014"> 
     <s:complexType> 
      <s:sequence> 
       <s:element name="MensEntrada"> 
        <s:complexType mixed="true"> 
         <s:choice maxOccurs="unbounded" minOccurs="0"> 
          <s:any processContents="lax"/> 
         </s:choice> 
        </s:complexType> 
       </s:element> 
      </s:sequence> 
     </s:complexType> 
    </s:element> 
    <s:element name="S014Response"> 
     <s:complexType> 
      <s:sequence> 
       <s:element name="MensSalida"> 
        <s:complexType mixed="true"> 
         <s:choice maxOccurs="unbounded" minOccurs="0"> 
          <s:any processContents="lax"/> 
         </s:choice> 
        </s:complexType> 
       </s:element> 
      </s:sequence> 
     </s:complexType> 
    </s:element> 
</s:schema> 

XSD app erzeugt einige Klassen,

S014.java

... 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "mensEntrada" 
}) 
@XmlRootElement(name = "S014") 
public class S014 { 

    @XmlElement(name = "MensEntrada", required = true) 
    protected S014 .MensEntrada mensEntrada; 

    public S014 .MensEntrada getMensEntrada() { 
     return mensEntrada; 
    } 

    public void setMensEntrada(S014 .MensEntrada value) { 
     this.mensEntrada = value; 
    } 

    @XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name = "", propOrder = { 
     "content" 
    }) 
    public static class MensEntrada { 
     @XmlMixed 
     @XmlAnyElement(lax = true) 
     protected List<Object> content; 
     public List<Object> getContent() { 
      if (content == null) { 
       content = new ArrayList<Object>(); 
      } 
      return this.content; 
     } 
    } 
} 

S014Response.java

... 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "mensSalida" 
}) 
@XmlRootElement(name = "S014Response") 
public class S014Response { 

    @XmlElement(name = "MensSalida", required = true) 
    protected S014Response.MensSalida mensSalida; 

    public S014Response.MensSalida getMensSalida() { 
     return mensSalida; 
    } 

    public void setMensSalida(S014Response.MensSalida value) { 
     this.mensSalida = value; 
    } 


    @XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name = "", propOrder = { 
     "content" 
    }) 
    public static class MensSalida { 
     @XmlMixed 
     @XmlAnyElement(lax = true) 
     protected List<Object> content; 
     public List<Object> getContent() { 
      if (content == null) { 
       content = new ArrayList<Object>(); 
      } 
      return this.content; 
     } 
    } 
} 

ObjectFactory.java

... 
@XmlRegistry 
public class ObjectFactory { 

    public ObjectFactory() { 
    } 

    public S014Response createS014Response() { 
     return new S014Response(); 
    } 

    public S014 createS014() { 
     return new S014(); 
    } 

    public S014Response.MensSalida createS014ResponseMensSalida() { 
     return new S014Response.MensSalida(); 
    } 

    public S014 .MensEntrada createS014MensEntrada() { 
     return new S014 .MensEntrada(); 
    } 
} 

Ich muss einen Web Service erstellen, um eine eingehende Nachricht "MensEntrada" zu lesen und "MensSalida" zurückgeben.

Ich habe versucht, dies:

... 
@WebService (serviceName = "S014Service", portName="S014ServiceSoap", targetNamespace = "http://SAS.Servicios/") 
public class S014Service extends AcceptMessage { 

    public S014Service(WebServiceReceiver webServiceReceiver) { 
     super(webServiceReceiver); 
    } 

    @WebMethod(action = "S014") 
    public S014Response S014(@WebParam(name = "MensEntrada") S014 param) { 
     String response = param.getMensEntrada().toString(); 
     response = response + "!!!"; 
     S014Response ms = new S014Response(); 
     return ms; 
    }  
} 

Aber es funktioniert nicht. Wie kann ich MensEntrada lesen? Wie kann ich MensSalida schreiben?

Vielen Dank im Voraus!

+0

Verwenden Sie die ObjectFactory, um Ihre Objekte zu erstellen, sobald Sie sie haben, verwenden Sie ihre Setter-Methoden, um Ihre Daten hinzuzufügen, wie MensSalida. Lies dir einfach deine ObjectFactory durch und es wird klarer. – giro

+0

Entschuldigung, ich habe deine Antwort nicht verstanden. Soll ich S014 mit ObjectFactory erweitern? Das Problem ist, dass ich AcceptMessage erweitern muss. Oder sollte ein neues Objekt erstellen? Zum Beispiel ObjectFactory ob = new ObjectFactory(); – user3815866

+0

Warum rufen Sie param.getMensEntrada() nicht in S014Service # S014 (S014) auf? Dann manipuliere es wie nötig und benutze dann ms = new ObjectFactory(). CreateS014ResponseMensSalida(), um ein neues S014Response-Objekt zu erhalten. Dann benutze die S014Response # setMensSalida (S014Response.MensSalida) dieser Klasse, um sie auf den von dir gewünschten Wert zu setzen. Dann gib einfach ms zurück. – giro

Antwort

0

Endlich konnte ich MensEntrada "Manchmal" lesen. Wenn ich diese WebMethod ("S0142"):

@WebMethod(action = "S0142") 
public void S0142(@WebParam(name = "param_name") S014 param) 
{ 
    List<Object> ls = param.getMensEntrada().getContent();  
    Node ds = (Node)ls.get(0); 
    String response = this.webServiceReceiver.processData(nodeToString(ds)); 
    List<Object> ls2 = new ArrayList<>(); 
    Node node = stringToNode(response); 
    ls2.add(node); 
    S014Response res = new S014Response(); 
    MensSalida ms = new MensSalida(); 
    ms.setContent(ls2); 
    res.setMensSalida(ms); 
    String test = nodeToString((Node)res.mensSalida.getContent().get(0)); 
} 

Es funktioniert, und ich kann S014Response (dank Gil R.)

Aber wenn ich eine andere dieser WebMethod ("S014") eingestellt :.

@WebMethod(action = "S014") 
public S014Response S014(@WebParam(name = "MensEntrada") S014 param) 
{ 
    List<Object> ls = param.getMensEntrada().getContent();  
    Node ds = (Node)ls.get(0); 
    String response = this.webServiceReceiver.processData(nodeToString(ds)); 
    List<Object> ls2 = new ArrayList<>(); 
    Node node = stringToNode(response); 
    ls2.add(node); 
    S014Response res = new S014Response(); 
    MensSalida ms = new MensSalida(); 
    ms.setContent(ls2); 
    res.setMensSalida(ms); 
    String test = nodeToString((Node)res.mensSalida.getContent().get(0)); 
    return res; 
} 

Es funktioniert nicht, weil param.getMensEntrada() getContent(); ist nicht lesbar.

SOAP-Umschlag für "S0142" ist dies:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sas="http://SAS.Servicios/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <sas:S0142> 
     <param_name> 
      <sas:MensEntrada> 
       [MyIncomingMessage] 
      </sas:MensEntrada> 
     </param_name> 
     </sas:S0142> 
    </soapenv:Body> 
</soapenv:Envelope> 

SOAP-Umschlag für "S014" ist dies:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sas="http://SAS.Servicios/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <sas:S014> 
      [MyIncomingMessage] 
     </sas:S014> 
    </soapenv:Body> 
</soapenv:Envelope> 

"...<param_name><sas:MensEntrada>...." is not present. 

Ist das richtig MyOutgoingMessage zurückzukehren?

@WebMethod(action = "S014") 
public S014Response S014(@WebParam(name = "MensEntrada") S014 param) 

Warum funktioniert es nicht?

+0

Kann mir jemand dabei helfen? Pls – user3815866