2017-08-29 18 views
0

私はWebサービスを開発する初心者です。 xjcコマンド(コマンドライン "xjc .... \ MySchema.xsd")を使用してXSDからJavaクラスを作成しました。xfcを使用したJava Webサービスの実装

<?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アプリはいくつかのクラスを生成し、

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(); 
    } 
} 

"MensEntrada"という着信メッセージを読み取るWebサービスを作成し、 "MensSalida"を返す必要があります。

... 
@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; 
    }  
} 

をしかし、それは動作しません:

私はこれをしようとしていました。 MensEntradaはどのように読むことができますか? MensSalidaはどのように書くことができますか?

ありがとうございます!

+0

ObjectFactoryを使用してオブジェクトを作成するとすぐに、それらのセッターメソッドを使用してMensSalidaなどのデータを追加します。 ObjectFactoryを読んでみると、より明確になります。 – giro

+0

申し訳ありませんが、あなたの回答を理解できませんでした。 ObjectFactoryでS014を拡張する必要がありますか?問題はAcceptMessageを拡張する必要があることです。または、新しいオブジェクトを作成する必要がありますか?例えば、ObjectFactory ob =新しいObjectFactory(); – user3815866

+0

S014Service#S014(S014)の中でparam.getMensEntrada()を呼び出してみませんか?次に、それを必要に応じて操作し、ms = new ObjectFactory()。createS014ResponseMensSalida()を使用して新しいS014Responseオブジェクトを取得します。次に、そのクラスのS014Response#setMensSalida(S014Response.MensSalida)を使用して、好きな値に設定します。その後、msを返します。 – giro

答えて

0

最後に、私はMensEntradaを「時には」読む必要があります。 私は、この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)); 
} 

を、と私はS014Response(ギル・R.のおかげで)

を設定することができますが、私が使用している場合は、別のこのWebメソッド( "S014") :

@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; 
} 

param.getMensEntrada()。getContent();これは機能しません。読めるわけではありません。 "S0142" の

SOAPエンベロープはこれです: "S014" の

<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エンベロープはこれです:

<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. 

はMyOutgoingMessageを返すために、この正しいですか?

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

なぜ機能しないのですか?

+0

誰か助けてくれますか? Pls – user3815866

関連する問題