使用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?
在此先感谢!
答
最后我读了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
使用ObjectFactory创建您的对象,只要您有它们,使用他们的setter方法来添加您的数据,如MensSalida。只要通读你的ObjectFactory,它就会变得更清晰。 – giro
对不起,我不明白你的回应。我应该用ObjectFactory来扩展S014吗?问题是我需要扩展AcceptMessage。还是应该创建一个新的对象?例如ObjectFactory ob = new ObjectFactory(); – user3815866
为什么不在S014Service#S014(S014)中调用param.getMensEntrada()?然后根据需要操作它,然后使用ms = new ObjectFactory()。createS014ResponseMensSalida()来获得一个新的S014Response对象。然后使用该类的S014Response#setMensSalida(S014Response.MensSalida)将其设置为您喜欢的任何值。然后只是返回毫秒。 – giro