Java 如何使用Axis2在Web服务中编写定制的消息接收器类?
我需要编写定制的消息接收器类,而不是使用输入输出的Java 如何使用Axis2在Web服务中编写定制的消息接收器类?,java,web-services,axis2,Java,Web Services,Axis2,我需要编写定制的消息接收器类,而不是使用输入输出的RPCMessageReceiver。我试过这样做,但不起作用。我不熟悉web服务和axis2。谁能帮我摆脱这个困境 package com.webservice; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.xml.stream.XMLStreamException; import org.apache.axio
RPCMessageReceiver
。我试过这样做,但不起作用。我不熟悉web服务和axis2。谁能帮我摆脱这个困境
package com.webservice;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.xml.stream.XMLStreamException;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.util.AXIOMUtil;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.description.AxisOperation;
import org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver;
import org.apache.axis2.util.JavaUtils;
import request.Address;
import request.TestRequest;
import response.TestResponse;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.StaxDriver;
@SuppressWarnings("deprecation")
public class MyServiceMessageReceiver extends AbstractInOutSyncMessageReceiver{
@Override
public void invokeBusinessLogic(MessageContext inMessageContext, MessageContext outMessageContext)
throws AxisFault {
Object obj = getTheImplementationObject(inMessageContext) ;
MyService webServiceImpl = (MyService) obj ;
AxisOperation operation = inMessageContext.getOperationContext().getAxisOperation();
if (operation == null && operation.getName() != null) {
throw new AxisFault("Operation is not located. SOAP ACTION must be specified") ;
}
String methodName = JavaUtils.xmlNameToJava(operation.getName().getLocalPart() ) ;
if (methodName == null) {
throw new AxisFault("Method with given name is not found") ;
}
if ("getEmployeeDetails".equalsIgnoreCase(methodName)) {
SOAPEnvelope soapEnvelope = inMessageContext.getEnvelope();
OMElement processTransactionElem = soapEnvelope.getBody().getFirstElement();
TestResponse testResponses = fromOM (webServiceImpl, processTransactionElem , getEnvelopeNamespaces(soapEnvelope));
if (testResponses != null) {
OMElement outelem = null ;
try {
outelem = convertToOM (testResponses);
} catch (XMLStreamException e) {
e.printStackTrace();
} inMessageContext.getEnvelope().getBody().setFirstChild(outelem) ;
outMessageContext.setEnvelope(inMessageContext.getEnvelope()) ;
} else {
System.out.println("Not Implemented");
}
}
private OMElement convertToOM(TestResponse testResponse) throws XMLStreamException {
XStream xstream = new XStream(new StaxDriver());
xstream.alias("testResponse",TestResponse.class);
String xmlStr = xstream.toXML(testResponse);
OMElement omele = AXIOMUtil.stringToOM(xmlStr);
return omele;
}
private TestResponse fromOM(MyService webServiceImpl, OMElement processTransactionElem, Map envelopeNamespaces) {
TestResponse testResponses = null;
try {
Iterator<OMElement> childElemIterator = processTransactionElem.getChildElements();
while (childElemIterator.hasNext()) {
OMElement childElem = childElemIterator.next();
String childName = childElem.getLocalName();
XStream stream = new XStream(new StaxDriver());
/*if("empId".equalsIgnoreCase(childName)){
empId = childElem.getText();
}*/
if ("getEmployeeDetails".equalsIgnoreCase(childName)) {
stream.alias("getEmployeeDetails", TestRequest.class);
stream.addImplicitArray(TestRequest.class, "address");
stream.alias("address", Address.class);
TestRequest request = (TestRequest)stream.fromXML(childName.toString());
testResponses = webServiceImpl.getEmployeeDetails(request);
}
return testResponses ;
}
} catch (Exception e) {
e.printStackTrace() ;
}
return null ;
}
private Map getEnvelopeNamespaces(SOAPEnvelope env){
Map returnMap = new HashMap();
OMNamespace ns;
for(Iterator namespaceIterator = env.getAllDeclaredNamespaces(); namespaceIterator.hasNext(); returnMap.put(ns.getPrefix(), ns.getNamespaceURI()))
ns = (OMNamespace)namespaceIterator.next();
return returnMap;
}
package.com.webservice;
导入java.util.HashMap;
导入java.util.Iterator;
导入java.util.Map;
导入javax.xml.stream.XMLStreamException;
导入org.apache.axiom.om.OMElement;
导入org.apache.axiom.om.OMNamespace;
导入org.apache.axiom.om.util.AXIOMUtil;
导入org.apache.axiom.soap.SOAPEnvelope;
导入org.apache.axis2.AxisFault;
导入org.apache.axis2.context.MessageContext;
导入org.apache.axis2.description.AxisOperation;
导入org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver;
导入org.apache.axis2.util.JavaUtils;
进口申请。地址;
导入请求.TestRequest;
导入response.TestResponse;
导入com.thoughtworks.xstream.xstream;
导入com.thoughtworks.xstream.io.xml.StaxDriver;
@抑制警告(“弃用”)
公共类MyServiceMessageReceiver扩展AbstractInOutSyncMessageReceiver{
@凌驾
public void invokeBusinessLogic(MessageContext inMessageContext、MessageContext outMessageContext)
断层{
objectobj=getTheImplementationObject(inMessageContext);
MyService-webservice-impl=(MyService)obj;
AxisOperation=inMessageContext.getOperationContext().getAxisOperation();
if(operation==null&&operation.getName()!=null){
抛出新AxisFault(“未找到操作。必须指定SOAP操作”);
}
String methodName=JavaUtils.xmlNameToJava(operation.getName().getLocalPart());
if(methodName==null){
抛出新的AxisFault(“未找到具有给定名称的方法”);
}
if(“getEmployeeDetails.equalsIgnoreCase(methodName)){
SOAPEnvelope SOAPEnvelope=inMessageContext.getEnvelope();
OmeElement processTransactionElem=soapEnvelope.getBody().getFirstElement();
TestResponse testResponses=fromOM(webServiceImpl、processTransactionElem、getEnvelopeNamespaces(soapEnvelope));
if(testResponses!=null){
OmeElement outelem=null;
试一试{
outelem=convertToOM(测试响应);
}捕获(XMLStreamException e){
e、 printStackTrace();
}inMessageContext.getEnvelope().getBody().setFirstChild(outelem);
setEnvelope(inMessageContext.getEnvelope());
}否则{
System.out.println(“未实施”);
}
}
私有OmeElement convertToOM(TestResponse TestResponse)抛出XMLStreamException{
XStream XStream=newxstream(new statxdriver());
别名(“testResponse”,testResponse.class);
字符串xmlStr=xstream.toXML(testResponse);
OMElement omele=AXIOMUtil.stringToOM(xmlStr);
返回蛋卷;
}
来自OM的私有测试响应(MyService webServiceImpl、OmeElement processTransactionElem、Map envelopeNamespaces){
TestResponse testResponses=null;
试一试{
迭代器childElemIterator=processTransactionElem.getChildElements();
while(childElemIterator.hasNext()){
OMElement childElem=childElemIterator.next();
字符串childName=childElem.getLocalName();
XStream stream=newXStream(new statxdriver());
/*if(“empId.equalsIgnoreCase(childName)){
empId=childElem.getText();
}*/
if(“getEmployeeDetails.equalsIgnoreCase(childName)){
别名(“getEmployeeDetails”,TestRequest.class);
addImplicitArray(TestRequest.class,“地址”);
流别名(“address”,address.class);
TestRequest=(TestRequest)stream.fromXML(childName.toString());
testResponses=webServiceImpl.getEmployeeDetails(请求);
}
返回测试响应;
}
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
私有映射getEnvelopeNamespaces(SOAPEnvelope环境){
Map returnMap=newhashmap();
OMNS;
for(迭代器名称空间迭代器=env.getAllDeclaredNamespaces();Namespace迭代器.hasNext();returnMap.put(ns.getPrefix(),ns.getNamespaceURI())
ns=(OMNamespace)namespaceIterator.next();
返回地图;
}
}
当我试图通过SOAP UI发送请求并接收响应时,它会抛出错误代码为soapenv:Receiver的响应。这意味着服务器没有处理消息。那么,您尝试了什么,哪些不起作用?@mmmmm Pie:我用我的方法编辑了我的问题。希望它能帮助您理解我的问题