7

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

我希望从 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);
    }
}

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

附加信息

使用骆驼 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);
    }

}
4

2 回答 2

4

根据我的经验,在 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")
于 2012-11-20T15:21:14.343 回答
0

我也尝试使用 CXF 深入研究 Apache Camel:)。

我认为抛出异常是关于参数数量的问题。 template.sendBody(what_is_called, input_parameter_s, output_parameter);

输出参数是调用 cxf webservices 最有可能的返回值。

于 2012-11-27T13:01:13.367 回答