使用xfc实现Java Web服务

问题描述:

我是一名开发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(); 
    } 
} 

我需要创建一个Web服务来读取传入消息“MensEntrada”并返回“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创建您的对象,只要您有它们,使用他们的setter方法来添加您的数据,如MensSalida。只要通读你的ObjectFactory,它就会变得更清晰。 – giro

+0

对不起,我不明白你的回应。我应该用ObjectFactory来扩展S014吗?问题是我需要扩展AcceptMessage。还是应该创建一个新的对象?例如ObjectFactory ob = new ObjectFactory(); – user3815866

+0

为什么不在S014Service#S014(S014)中调用param.getMensEntrada()?然后根据需要操作它,然后使用ms = new ObjectFactory()。createS014ResponseMensSalida()来获得一个新的S014Response对象。然后使用该类的S014Response#setMensSalida(S014Response.MensSalida)将其设置为您喜欢的任何值。然后只是返回毫秒。 – giro

最后我读了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.)

但如果我用另一本的WebMethod( “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信封是这样的:

<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信封为 “S014” 是这样的:

<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

有人可以帮我吗? 请致电 – user3815866