如何使用 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。
您好,我正在尝试使用 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。