lof*_*ffa 7 soap cxf apache-camel
我有一个预先存在的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.
Run Code Online (Sandbox Code Playgroud)
我已经检查过第一个参数实际上是传入的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);
}
}
Run Code Online (Sandbox Code Playgroud)
我是骆驼和网络服务的新手,所以任何有用的指针都将非常感激.
附加信息
使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
根据我的经验,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.
}
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
使用 Spring 应用程序上下文中定义的 WebServiceProcessorBean 和 beanRef() DSL 方法。
.beanRef("theProxyService", "callWebservice")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5083 次 |
| 最近记录: |