Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Axis2在Web服务中编写定制的消息接收器类?_Java_Web Services_Axis2 - Fatal编程技术网

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:我用我的方法编辑了我的问题。希望它能帮助您理解我的问题