具有多个命名空间的Camel SoapJaxbDataFormat

时间:2018-02-19 09:41:21

标签: soap namespaces jaxb apache-camel dataformat

我需要在我的Camel路由中将入站xml编组为SOAP数据格式以用于数据转换,我遇到一个问题,其中入站消息包含在除了root之外的元素中定义的命名空间,这导致部分邮件丢失或格式不正确。

我如何为具有多个名称空间的消息定义SoapJaxbDataFormat?

示例Camel Route我一直用来追踪我的问题

import com.example.ws.ExampleDataResponse;
import javax.xml.namespace.QName;
import org.apache.camel.dataformat.soap.name.QNameStrategy;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.model.dataformat.SoapJaxbDataFormat;

public class ExampleCamelRoute extends RouteBuilder {

   // defining my SOAP format
   SoapJaxbDataFormat soapExampleDataResponse;

@Override
public void configure() throws Exception {

    // Setting my data format
    soapExampleDataResponse = new SoapJaxbDataFormat(ExampleDataResponse.class.getPackage().getName(), new QNameStrategy(new QName("http://ws.example.com","exampleDataResponse")));

    // Enter route definition here
      from("amqp:queue:{{ExampleDataResponse.queue}}").routeId("ExampleDataResponse")
                .streamCaching()
                .log("Data receved from example")
                // view the orignal message
                .to("file:C:/Camel_Target?fileName=ExampleData_Orignal.xml", "direct:writeMarshaledData", "direct:writeUnMarshaledData");

      from("direct:writeMarshaledExampleData").routeId("writeMarshaledExampleData")
                .marshal(soapExampleDataResponse)
                // view the marshaled message
                .to("file:C:/Camel_Target?fileName=ExampleData_marshal.xml");

      from("direct:writeUnMarshaledExampleData").routeId("writeUnMarshaledExampleData")
                .unmarshal(soapExampleDataResponse)
                // view the unmarshaled message
                .to("file:C:/Camel_Target?fileName=ExampleData_UnMarshaled.xml");          
}



}

写入文件的原始入站xml邮件示例,我需要将此数据编组/解组为SOAP格式

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <exampleDataResponse xmlns="http://ws.example.com">
            <exampleDataReturn>
                <name>user1</name>
                <number>8797877979877</number>
                <contacts>
                    <ns1:name xmlns:ns1="http://contact.ws.example.com">contact1</ns1:name>
                    <ns2:number xmlns:ns2="http://contact.ws.example.com">4545664464564</ns2:number>
                </contacts>
            </exampleDataReturn>
        </exampleDataResponse>
    </soapenv:Body>
</soapenv:Envelope>

写入文件的示例封送数据

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<ns2:Envelope xmlns:ns5="http://data.contact.ws.example.com" xmlns:ns2="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns4="http://contact.ws.example.com" xmlns:ns3="http://ws.example.com">
    <ns2:Body>
        <ns3:exampleDataResponse>4545664464564</ns3:exampleDataResponse>
    </ns2:Body>
</ns2:Envelope>

正如您所看到的,此处的数据不正确。

写入文件的解组邮件示例

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
<ns2:exampleDataResponse xmlns="http://contact.ws.example.com" xmlns:ns2="http://ws.example.com"/>

正如你可以看到这里的数据是不正确的,我在我的骆驼路线中使用了很多SoapJaxbDataFormat并且之前没有遇到过这个问题,陌生人仍然没有错误。

感谢您提供有关我如何正确定义此格式的任何帮助。

0 个答案:

没有答案