如何使用 Camel-SOAP 解组

How to use Camel-SOAP unmarshal

您好,我正在尝试使用 Camel-SOAP 组件来解组使用 MQ 发送的 soap 消息。 但是我不知道如何使用 SoapJaxbDataFormat 所需的 ServiceInterfaceStrategy

我正在使用 maven-jaxb2-plugin 生成我的 JAXB bean,使用提供的 wsdl,xsd。

我应该使用什么class?
以及如何使用 maven-jaxb2-plugin 生成它?

SoapJaxbDataFormat soap = new 
SoapJaxbDataFormat("xx.xxx.service._201x._01._01.notification", new 
ServiceInterfaceStrategy(WHAT_CLASS_TO_USE.class, false));

And how do I generate it with maven-jaxb2-plugin ?

要使用插件生成 class 文件,请尝试以下配置:

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.13.1</version>
    <executions>
        <execution>
            <id>generate</id>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <schemaDirectory>src/test/resources/wsdl</schemaDirectory>
                <generatePackage>org.tempuri.calculator.jaxb2</generatePackage>
                <generateDirectory>src/test/java</generateDirectory>
                <clearOutputDir>false</clearOutputDir>
                <episode>false</episode>
                <strict>true</strict>
                <schemaIncludes>
                    <schemaInclude>*.wsdl</schemaInclude>
                    <schemaInclude>*.xsd</schemaInclude>
                </schemaIncludes>
            </configuration>
        </execution>
    </executions>
</plugin>

生成源代码的 maven 命令是:mvn generate-sources.

What class should I use ?

要在您的路线中使用它,请尝试以下操作:

protected SoapJaxbDataFormat createDataFormat() {
    String jaxbPackage = Add.class.getPackage().getName();
    ElementNameStrategy elStrat = new TypeNameStrategy();
    SoapJaxbDataFormat answer = new SoapJaxbDataFormat(jaxbPackage, elStrat);
    answer.setVersion("1.2");
    return answer;
}

@Override
protected RoutesBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        @Override
        public void configure() throws Exception {
            SoapJaxbDataFormat df = createDataFormat();
            from("direct:start") //
                .marshal(df) //
                .to("mock:result");
        }
    };
}

消息应该是 XML 这样的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Envelope xmlns="http://www.w3.org/2003/05/soap-envelope" xmlns:ns2="http://tempuri.org/">
    <Body>
        <ns2:Add>
            <ns2:intA>10</ns2:intA>
            <ns2:intB>20</ns2:intB>
        </ns2:Add>
    </Body>
</Envelope>

对应的 POJO(由 jaxb2 插件生成):

package org.tempuri.calculator.jaxb2;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "intA",
    "intB"
})
@XmlRootElement(name = "Add")
public class Add {

    protected int intA;
    protected int intB;

    public int getIntA() {
        return intA;
    }

    public void setIntA(int value) {
        this.intA = value;
    }

    public int getIntB() {
        return intB;
    }

    public void setIntB(int value) {
        this.intB = value;
    }

}

不要忘记将 camel-soap 依赖项添加到您的 pom 文件中:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-soap</artifactId>
</dependency>

可以找到此示例使用的 WSDL here, based on this unit test