gpt4 book ai didi

soap - 使用 Java DSL 的 Camel CXF POJO 模式

转载 作者:行者123 更新时间:2023-12-04 12:34:37 26 4
gpt4 key购买 nike

我有一个预先存在的 Web 服务“连接”(SOAP),如果可能,我想在不使用 Swing 框架的情况下调用。我遵循了使用 cxf/wsdl2java 工具生成我的 java 文件的 contact first development。

我希望从 java 对象中提取用户名和密码并将其放置在 SOAP 对象中,然后发送到我的本地主机 Web 服务。

将 Connect 对象作为正文发送到“direct:start”时,出现异常...

Caused by: java.lang.IllegalArgumentException: Get the wrong parameter size to invoke the out service, Expect size 2, Parameter size 1. Please check if the message body matches the CXFEndpoint POJO Dataformat request.

我检查过第一个参数实际上是传入的 Connect 对象的一个​​实例。

我是否需要在其中一个类中添加一些附加注释,测试方法是否无效或
有没有我应该遵循的替代模式?
public class TestConnectCXF extends CamelTestSupport
{
@Override
protected RouteBuilder createRouteBuilder() throws Exception
{
return new RouteBuilder()
{
String cxfAddressLine = "cxf:http://localhost:8081/nuxeo/webservices/privateadservice?wsdlURL=wsdl/privateadservice.wsdl" //
+ "&dataFormat=POJO" //
+ "&serviceClass=com.sandbox.camelfeed.PrivateAdServiceInterface" //
+ "&serviceName={http://ws.sandboxtest.com/}PrivateAdService" //
+ "&synchronous=true" //
+ "&loggingFeatureEnabled=true" //
+ "&portName={http://ws.sandboxtest.com/}PrivateAdServiceInterfacePort";
@Override
public void configure() throws Exception
{
from("direct:start").to(cxfAddressLine).to("mock:end");
}
};
}

@Test
public void testConnectViaPojo() throws InterruptedException
{
Connect connectToServer = new Connect();
connectToServer.setUserName("FakeUser");
connectToServer.setPassword("scrubbed");
template.sendBody("direct:start", connectToServer);
Thread.sleep(1000);
}
}

我是 Camel 和网络服务的新手,所以任何有用的指针都将不胜感激。

附加信息

使用 Camel 2.10,Java 1.6

从 wsdl2java 生成的类
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "connect", propOrder = {
"userName",
"password"
})
public class Connect {

protected String userName;
protected String password;

public String getUserName() {
return userName;
}

public void setUserName(String value) {
this.userName = value;
}


public String getPassword() {
return password;
}

public void setPassword(String value) {
this.password = value;
}
}

@WebService(targetNamespace = "http://ws.sandboxtest.com/", name = "PrivateAdServiceInterface")
@XmlSeeAlso({ObjectFactory.class})
public interface PrivateAdServiceInterface {

// Omitted Code relating to other web calls

@WebResult(name = "return", targetNamespace = "")
@RequestWrapper(localName = "connect", targetNamespace = "http://ws.sandboxtest.com/", className = "com.sandbox.camelfeed.Connect")
@WebMethod
@ResponseWrapper(localName = "connectResponse", targetNamespace = "http://ws.sandboxtest.com/", className = "com.sandbox.camelfeed.ConnectResponse")
public java.lang.String connect(
@WebParam(name = "userName", targetNamespace = "")
java.lang.String userName,
@WebParam(name = "password", targetNamespace = "")
java.lang.String password
) throws ClientException_Exception;
}

@XmlRegistry
public class ObjectFactory {
{
// Omitted other web calls information
private final static QName _Connect_QNAME = new QName("http://ws.sandboxtest.com/", "connect");

@XmlElementDecl(namespace = "http://ws.sandboxtest.com/", name = "connect")
public JAXBElement<Connect> createConnect(Connect value) {
return new JAXBElement<Connect>(_Connect_QNAME, Connect.class, null, value);
}

}

最佳答案

根据我的经验,在 Camel 中有一些事情,比如调用 SOAP Web 服务或进行 REST 调用,在自定义处理器中比使用像 CXF、HTTP 或 HTTP4 这样的组件更容易完成。

我通常使用 Spring,因此我倾向于使用 Spring REST 模板或 JaxWsPortProxyFactoryBean(用于 Web 服务调用)进行出站调用。

下面是一个使用 JAX-WS 调用的示例:

    public class WebServiceProcessorBean {

@Autowired
private JAXWSProxy theProxy;


public void callWebservice(Exchange exchange) {
Response response = theProxy.call();

//Do something with the response and Exchange.
}
}

Spring应用上下文中的定义:
<bean id="theProxyService" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
<property name="serviceInterface" value="XXX"/>
<property name="wsdlDocumentUrl" value="http://xxxxx.wsdl"/>
<property name="namespaceUri" value="xxxx"/>
<property name="serviceName" value="xxxx"/>
<property name="portName" value="xxxxx"/>
</bean>

将 Spring 应用程序上下文中定义的 WebServiceProcessorBean 与 beanRef() DSL 方法一起使用。
.beanRef("theProxyService", "callWebservice")

关于soap - 使用 Java DSL 的 Camel CXF POJO 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13133167/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com