RawXMLINOutMessageReceiver显示wsdl文件失败,说是aixs v1的bug,
RPCMessageReceiver显示没问题,.net调用成功。
其他的功能不清楚,应该是和OMElement有关系

解决方案 »

  1.   

    使用 RawXMLINOutMessageReceiver的service的方法要么没有参数要么只能接受OMElement类型的参数 返回也是OMElement类型 。
    使用 RPCMessageReceiver的参数可以是任意的java type.返回可以使任意的java type 。RPCMessageReceiver 负责 OMEelment到 java type 或者java type到OMElement的转换。
      

  2.   

    RawXMLINOutMessageReceiver 的核心代码
    public void invokeBusinessLogic(MessageContext msgContext, MessageContext newmsgContext)
                throws AxisFault {
            try {            // get the implementation class for the Web Service
                Object obj = getTheImplementationObject(msgContext);            // find the WebService method
                Class ImplClass = obj.getClass();            // Inject the Message Context if it is asked for
                DependencyManager.configureBusinessLogicProvider(obj,
                        msgContext.getOperationContext());            AxisOperation opDesc = msgContext.getOperationContext().getAxisOperation();
                Method method = findOperation(opDesc, ImplClass);            if (method != null) {
                    Class[]  parameters = method.getParameterTypes();
                    Object[] args;                if ((parameters == null) || (parameters.length == 0)) {
                        args = new Object[0];
                    } else if (parameters.length == 1) {
                        OMElement omElement = msgContext.getEnvelope().getBody().getFirstElement();
                        args = new Object[]{omElement};
                    } else {
                        throw new AxisFault(Messages.getMessage("rawXmlProivdeIsLimited"));
                    }                OMElement result;
                    try {
                        result = (OMElement) method.invoke(obj, args);
                    } catch (Exception e) {
                        throw new AxisFault(e.getMessage());
                    }                AxisService service = msgContext.getAxisService();
                    service.getTargetNamespace();
                    result.declareNamespace(service.getTargetNamespace(),
                            service.getTargetNamespacePrefix());
                    OMElement bodyContent;                SOAPFactory fac = getSOAPFactory(msgContext);
                    bodyContent = result;                SOAPEnvelope envelope = fac.getDefaultEnvelope();                if (bodyContent != null) {
                        envelope.getBody().addChild(bodyContent);
                    }                newmsgContext.setEnvelope(envelope);
                } else {
                    throw new AxisFault(Messages.getMessage("methodNotImplemented",
                            opDesc.getName().toString()));
                }
            } catch (Exception e) {
                throw AxisFault.makeFault(e);
            }
        }
      

  3.   

    RPCMessageReceiver 的核心代码
    public void invokeBusinessLogic(MessageContext inMessage, MessageContext outMessage) throws AxisFault {
            try {
                // get the implementation class for the Web Service
                Object obj = getTheImplementationObject(inMessage);            Class ImplClass = obj.getClass();
                DependencyManager.configureBusinessLogicProvider(obj,
                        inMessage.getOperationContext());            AxisOperation op = inMessage.getOperationContext().getAxisOperation();
                AxisService service = inMessage.getAxisService();
                OMElement methodElement = inMessage.getEnvelope().getBody()
                        .getFirstElement();
                AxisMessage inaxisMessage = op.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
                String messageNameSpace = null;
                if (inaxisMessage != null) {
                    messageNameSpace = inaxisMessage.getElementQName().getNamespaceURI();
                }            OMNamespace namespace = methodElement.getNamespace();
                if (namespace == null || !messageNameSpace.equals(namespace.getName())) {
                    throw new AxisFault("namespace mismatch require " +
                            messageNameSpace +
                            " found " + methodElement.getNamespace().getName());
                }
                String methodName = op.getName().getLocalPart();
                Method[] methods = ImplClass.getMethods();
                for (int i = 0; i < methods.length; i++) {
                    if (methods[i].getName().equals(methodName)) {
                        this.method = methods[i];
                        break;
                    }
                }
                Object[] objectArray = RPCUtil.processRequest(methodElement, method);
                Object resObject;
                try {
                    resObject = method.invoke(obj, objectArray);
                } catch (Exception e) {
                    throw new AxisFault.makeFault(e);
                }
                SOAPFactory fac = getSOAPFactory(inMessage);            // Handling the response
                AxisMessage outaxisMessage = op.getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
                if (inaxisMessage != null) {
                    messageNameSpace = outaxisMessage.getElementQName().getNamespaceURI();
                }            OMNamespace ns = fac.createOMNamespace(messageNameSpace,
                        service.getSchematargetNamespacePrefix());
                SOAPEnvelope envelope = fac.getDefaultEnvelope();
                OMElement bodyContent = null;            if (resObject instanceof Object[]) {
                    QName resName = new QName(service.getSchematargetNamespace(),
                            method.getName() + "Response",
                            service.getSchematargetNamespacePrefix());
                    OMElement bodyChild = RPCUtil.getResponseElement(resName, (Object[]) resObject);
                    envelope.getBody().addChild(bodyChild);
                } else {
                    RPCUtil.processResponse(fac, resObject, bodyContent, ns, envelope, method);
                }            outMessage.setEnvelope(envelope);        } catch (Exception e) {
                throw AxisFault.makeFault(e);
            }
        }
      

  4.   

    RPCMessageReceiver类可处理输入输出。