我想创建Java webservice,它将接受xml格式的请求和xml中的响应。
我不想要字符串格式的xml。我的客户端是非Java技术(Ab-initio)。
请求/响应XML数据必须符合特定的xsd,它将作为操作的请求/响应类型在WSDL中。
即。 '类型' wsdl的元素。
如果有人对此有所了解,请分享。
<wsdl:types><xsd:schema targetNamespace="http://www.example.org/WS_WSDLFile/">
<!-- Message request type from MessageRequest.xsd imported this is RS2 -->
<xsd:import namespace="http://www.example.org/MessageRequest"
schemaLocation="MessageRequest.xsd"></xsd:import>
<!-- Message response type from MessageResponse.xsd imported this is ISO -->
<xsd:import namespace="http://www.example.org/MessageResponse"
schemaLocation="MessageResponse.xsd"></xsd:import>
</xsd:schema>
</wsdl:types>
谢谢!
答案 0 :(得分:0)
最后,我自己找到了这个问题的解决方案。
JAXB
API在此解决方案中至关重要。
步骤:
1)我使用xsd(客户端将发送xml作为webmethod的参数)并使用cmd中的'XJC'工具创建Java类。
在命令提示符下执行命令:
d:\ MyWorkSpace \ MyProject的&GT; xjc -d src MessageRequest.xsd
- 此命令执行将为请求xsd创建xml绑定classess。
d:\ MyWorkSpace \ MyProject的&GT; xjc -d src MessageResponse.xsd
- 此命令执行将为响应xsd创建xml绑定classess。
2)也使用XJC工具为响应创建了相同的Java类。
3)为请求&amp;创建java类之后响应xsds 开始创建JAX-WS实现。
注意:在我的情况下,'TX'是'MessageRequest.xsd'的根元素,'Document'是'MessageResponse.xsd'的元素
所以我的界面就是这个
@WebService
@SOAPBinding(style= Style.DOCUMENT,use= Use.LITERAL)
public interface MessageIntf
{
/*Interface which declaring webmethod for webservice
* Webmethod accepting XMLObject of 'TX' class as a request and returning also XMLObject of 'Document' class.
*/
@WebMethod(operationName="getISOMessage", action="http://localhost:8090/service/mService1")
public Document getMessage(TX txObject);
}
**我的实施班**
package pub.pkg;
import javax.jws.WebService;
import jax.serv.TX;
import iso.std.AcceptorBatchTransferV02;
import iso.std.CardPaymentBatchTransfer1;
import iso.std.Document;
import iso.std.Header3;
@WebService(endpointInterface="pub.pkg.MessageIntf")
public class MessImpl implements MessageIntf {
/*
This is a implementation class having implementation method
*/
@Override
public Document getMessage(TX txObject)
{
JaxUnmarshaller jx = new JaxUnmarshaller();// creating object of JaxUnmarshaller class
Document doc = jx.getXmlData(); // binding xml into XMLObject
return doc; // returning response xmlObject to client
}
}
我的端点发布商类:
package pub.pkg;
import javax.xml.ws.Endpoint;
public class MessagePublisher {
public static void main(String[] args) {
Endpoint.publish("http://localhost:8097/service/mService1", new MessImpl());
System.out.println("Service Deployed Successfully...");
}
}
当量
http://localhost:8097/service/mService1?wsdl
检查wsdl的类型元素。
以下是 clienside实施 ..我只提供主类,编组/解组请自行完成。
package com.client;
import iso.std.Document;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import jax.serv.TX;
import pub.pkg.MessageIntf;
public class WebClient
{
public static void main(String[] args) throws Exception {
URL url = new URL("http://localhost:8097/service/mService1?wsdl"); // URL of webservice wsdl
QName qname = new QName("http://pkg.pub/", "MessImplService"); // Defining namespace and service Name of webservice
Service service = Service.create(url, qname); // creating service obj
MessageIntf msgObj = service.getPort(MessageIntf.class); // catching the object from server in Interface
JaxUnmarshaller jx = new JaxUnmarshaller(); // creating Unmarshller object
TX txObject = jx.getXmlData(); // binding xml data in to XML Object
Document domObject = msgObj.getMessage(txObject);
/* call the webservice method by passing XMLobject and returning response XMLObject */
new JaxMarshaller().createXML(domObject);
// converting xml object into actual xml
}
}