我有一个预先存在的Web服务“connect”(SOAP)我想在不使用Swing框架的情况下调用它。我已经使用cxf / wsdl2java工具跟踪了联系第一个开发生成我的java文件。
我希望从java对象中提取userName和密码,并将其放在SOAP对象中,然后发送到我的localhost 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 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);
}
}
答案 0 :(得分:4)
根据我的经验,Camel中有一些东西,比如调用SOAP Web服务或进行REST调用,在自定义处理器中比使用像CXF,HTTP或HTTP4这样的组件更容易。
我通常使用Spring,因此我倾向于使用Spring REST模板或JaxWsPortProxyFactoryBean(用于Webservice调用)进行出站调用。
以下是使用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")
答案 1 :(得分:0)
我也尝试用CXF挖掘Apache Camel:)。
我认为抛出的异常是关于参数数量的问题。
template.sendBody(what_is_called, input_parameter_s, output_parameter);
输出参数是调用cxf webservices时最可能的返回值。