Camel:如何在处理CXF请求后返回有效的SOAP响应

Camel:如何在处理CXF请求后返回有效的SOAP响应,soap,cxf,response,apache-camel,envelope,Soap,Cxf,Response,Apache Camel,Envelope,因此,我有一个公开Webservice端点的路由。收到请求后,我将一些信息发送到一些队列,并希望将响应返回给原始调用者。 响应是一个枚举,可以有4个值(OK、NULL、RPT、NOK) 我可以在soapUI中获得响应,但它不在有效的SOAP信封中。这意味着,当在Java或.Net中处理响应时,会抛出一个异常,表示没有有效的信封命名空间 如何保证发送的响应是SOAPMessage 要生成响应消息,我有以下方法: public OnClientEventResponse process(Messag

因此,我有一个公开Webservice端点的路由。收到请求后,我将一些信息发送到一些队列,并希望将响应返回给原始调用者。 响应是一个枚举,可以有4个值
(OK、NULL、RPT、NOK)

我可以在soapUI中获得响应,但它不在有效的SOAP信封中。这意味着,当在Java或.Net中处理响应时,会抛出一个异常,表示没有有效的信封命名空间

如何保证发送的响应是SOAPMessage

要生成响应消息,我有以下方法:

public OnClientEventResponse process(Message message){
    if(message.getBody().toString().contains("OnClientEventResponse")){
        return (OnClientEventResponse) message.getBody();
    }
    OnClientEventResponse resp = new OnClientEventResponse();
    resp.setReturn(Response.OK);
    return resp;
}
在soapUi中,我得到以下信息:

<onClientEventResponse>
   <Response>OK</Response>
</onClientEventResponse>

}

我不确定它是否适用于camel,但请尝试将此注释添加到您的界面中

@WebService(name = "ClientEventNotifierEndpoint")
@SOAPBinding(style = SOAPBinding.Style.RPC)

公共接口ClientEventNotifierEndpoint{

我不确定它是否适用于camel,但请尝试将此注释添加到您的接口中

@WebService(name = "ClientEventNotifierEndpoint")
@SOAPBinding(style = SOAPBinding.Style.RPC)

公共接口客户端通知端点{

我确信您不再等待此答案,但由于我刚刚完成查找,您必须执行以下操作:

package com.xxxxx.esb.invoice.processors;

import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.component.cxf.CxfPayload;
import org.apache.camel.converter.jaxp.XmlConverter;
import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;

import com.xxxxx.esb.invoice_service_spec.ProcessFileResponse;

/**
 * @author pantinor
 * 
 * 
 * 
 */
public class SoapResponseProcessor implements Processor {
    private static final String ROOT_NODE = "processFileResponse";
    private static final String NAMESPACE = "http://www.xxxxx.com/Esb/invoice-service    -spec";
    private static final String OK = "OK";
    protected static final Logger LOG = Logger
            .getLogger(SoapResponseProcessor.class);

    @Override
    public void process(Exchange exchange) throws Exception {
        //lots a support classes to serialize my answer
        List<Source> outElements = new ArrayList<Source>();
        XmlConverter converter = new XmlConverter();
        StringWriter writer = new StringWriter();
        JAXBContext context = JAXBContext
                .newInstance(ProcessFileResponse.class);
        Marshaller m = context.createMarshaller();

        //build my business answer
        ProcessFileResponse result = new ProcessFileResponse();
        result.setReturn(OK);

        //serialize the answer

        //the following is required since the JAXB annotated class does not include     the XMLRoot annotation
        m.marshal(new JAXBElement<ProcessFileResponse>(new QName(NAMESPACE,
                ROOT_NODE), ProcessFileResponse.class, result), writer);

        Document outDocument = converter.toDOMDocument(writer.toString());
        outElements.add(new DOMSource(outDocument.getDocumentElement()));

        //use camel class cxf class to produce a payload that the cxf component can     consume for the answer
        CxfPayload<SoapHeader> responsePayload = new CxfPayload<SoapHeader>(
                null, outElements, null);

        //write the anwer
        exchange.getIn().setBody(responsePayload);


    }

}    
包com.xxxxx.esb.invoice.processors;
导入java.io.StringWriter;
导入java.util.ArrayList;
导入java.util.List;
导入javax.xml.bind.JAXBContext;
导入javax.xml.bind.JAXBElement;
导入javax.xml.bind.Marshaller;
导入javax.xml.namespace.QName;
导入javax.xml.transform.Source;
导入javax.xml.transform.dom.DOMSource;
导入org.apache.camel.Exchange;
导入org.apache.camel.Processor;
导入org.apache.camel.component.cxf.CxfPayload;
导入org.apache.camel.converter.jaxp.XmlConverter;
导入org.apache.cxf.binding.soap.SoapHeader;
导入org.apache.log4j.Logger;
导入org.w3c.dom.Document;
导入com.xxxxx.esb.invoice\u service\u spec.ProcessFileResponse;
/**
*@作者潘蒂诺
* 
* 
* 
*/
公共类SoapResponseProcessor实现处理器{
私有静态最终字符串ROOT\u NODE=“processFileResponse”;
私有静态最终字符串命名空间=”http://www.xxxxx.com/Esb/invoice-service    -规格”;
私有静态最终字符串OK=“OK”;
受保护的静态最终记录器日志=记录器
.getLogger(SoapResponseProcessor.class);
@凌驾
公共作废进程(Exchange)引发异常{
//很多支持类来序列化我的答案
List outElements=new ArrayList();
XmlConverter converter=新的XmlConverter();
StringWriter编写器=新的StringWriter();
JAXBContext context=JAXBContext
.newInstance(ProcessFileResponse.class);
Marshaller m=context.createMarshaller();
//建立我的商业答案
ProcessFileResponse结果=新的ProcessFileResponse();
result.setReturn(OK);
//将答案序列化
//由于JAXB注释类不包括XMLRoot注释,因此需要执行以下操作
m、 封送处理(新JAXBElement)(新QName(命名空间,
根节点),ProcessFileResponse.class,result),writer);
Document outDocument=converter.toDOMDocument(writer.toString());
add(新的DOMSource(outDocument.getDocumentElement());
//使用camel类cxf类生成cxf组件可以为答案使用的有效负载
CxfPayload responsePayload=新的CxfPayload(
null,outelement,null);
//写答案
exchange.getIn().setBody(responsePayload);
}
}    

我确信您不再等待这个答案,但由于我刚刚完成寻找答案的工作,您必须做以下几点:

package com.xxxxx.esb.invoice.processors;

import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.component.cxf.CxfPayload;
import org.apache.camel.converter.jaxp.XmlConverter;
import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;

import com.xxxxx.esb.invoice_service_spec.ProcessFileResponse;

/**
 * @author pantinor
 * 
 * 
 * 
 */
public class SoapResponseProcessor implements Processor {
    private static final String ROOT_NODE = "processFileResponse";
    private static final String NAMESPACE = "http://www.xxxxx.com/Esb/invoice-service    -spec";
    private static final String OK = "OK";
    protected static final Logger LOG = Logger
            .getLogger(SoapResponseProcessor.class);

    @Override
    public void process(Exchange exchange) throws Exception {
        //lots a support classes to serialize my answer
        List<Source> outElements = new ArrayList<Source>();
        XmlConverter converter = new XmlConverter();
        StringWriter writer = new StringWriter();
        JAXBContext context = JAXBContext
                .newInstance(ProcessFileResponse.class);
        Marshaller m = context.createMarshaller();

        //build my business answer
        ProcessFileResponse result = new ProcessFileResponse();
        result.setReturn(OK);

        //serialize the answer

        //the following is required since the JAXB annotated class does not include     the XMLRoot annotation
        m.marshal(new JAXBElement<ProcessFileResponse>(new QName(NAMESPACE,
                ROOT_NODE), ProcessFileResponse.class, result), writer);

        Document outDocument = converter.toDOMDocument(writer.toString());
        outElements.add(new DOMSource(outDocument.getDocumentElement()));

        //use camel class cxf class to produce a payload that the cxf component can     consume for the answer
        CxfPayload<SoapHeader> responsePayload = new CxfPayload<SoapHeader>(
                null, outElements, null);

        //write the anwer
        exchange.getIn().setBody(responsePayload);


    }

}    
包com.xxxxx.esb.invoice.processors;
导入java.io.StringWriter;
导入java.util.ArrayList;
导入java.util.List;
导入javax.xml.bind.JAXBContext;
导入javax.xml.bind.JAXBElement;
导入javax.xml.bind.Marshaller;
导入javax.xml.namespace.QName;
导入javax.xml.transform.Source;
导入javax.xml.transform.dom.DOMSource;
导入org.apache.camel.Exchange;
导入org.apache.camel.Processor;
导入org.apache.camel.component.cxf.CxfPayload;
导入org.apache.camel.converter.jaxp.XmlConverter;
导入org.apache.cxf.binding.soap.SoapHeader;
导入org.apache.log4j.Logger;
导入org.w3c.dom.Document;
导入com.xxxxx.esb.invoice\u service\u spec.ProcessFileResponse;
/**
*@作者潘蒂诺
* 
* 
* 
*/
公共类SoapResponseProcessor实现处理器{
私有静态最终字符串ROOT\u NODE=“processFileResponse”;
私有静态最终字符串命名空间=”http://www.xxxxx.com/Esb/invoice-service    -规格”;
私有静态最终字符串OK=“OK”;
受保护的静态最终记录器日志=记录器
.getLogger(SoapResponseProcessor.class);
@凌驾
公共作废进程(Exchange)引发异常{
//很多支持类来序列化我的答案
List outElements=new ArrayList();
XmlConverter converter=新的XmlConverter();
StringWriter编写器=新的StringWriter();
JAXBContext context=JAXBContext
.newInstance(ProcessFileResponse.class);
Marshaller m=context.createMarshaller();
//建立我的商业答案
ProcessFileResponse结果=新的ProcessFileResponse();
result.setReturn(OK);
//将答案序列化
//由于JAXB注释类不包括XMLRoot注释,因此需要执行以下操作
m、 封送处理(新JAXBElement)(新QName(命名空间,
根节点),ProcessFileResponse.class,result),writer);
Document outDocument=converter.toDOMDocument(writer.toString());
add(新的DOMSource(outDocument.getDocumentElement());
//使用camel类cxf类生成cxf组件可以为答案使用的有效负载
CxfPayload responsePayload=新的CxfPayload(
null,outelement,null);
//写答案
exchange.getIn().s