我目前正在开发一个处理SOAP Web服务的Java应用程序。
问题在于我解析WSDL [Apache Axis的 Parser 对象为我做了],然后我创建了调用。
当我尝试调用它时,我必须传递一个Object []来分配参数[取自WSDL的Action]。正常的操作很简单,但是当我有自定义数据类型时,我无法让它为我填写。我尝试传递Object [] {new Object {}},但它会分配第一个字段。我无法通过它已经处理过,因为它改变了'< >”到'--lt --gt',服务器无法识别它。
这是WSDL的一个片段。
<s:element name="FERecuperaQTYRequest"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="argAuth" type="tns:FEAuthRequest" /> </s:sequence> </s:complexType> </s:element> <s:complexType name="FEAuthRequest"> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="Token" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="Sign" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="cuit" type="s:long" /> </s:sequence> </s:complexType>
这就是麻烦的Java Fragment
QTY = (String) call.invoke (
new Object[]{
new Object[]{
tokenConexion.getToken (),
tokenConexion.getSign (),
tokenConexion.getCUIT ()
}
});
答案 0 :(得分:1)
您是否考虑过使用Spring的代理功能?你在spring配置文件中告诉它一些关于webservice的内容,你所有客户端代码必须处理的是你创建的一个接口 - 它甚至不必知道另一边有一个web服务! / p>
Spring配置示例:
<bean id="myService" class="org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean">
<property name="serviceFactoryClass" value="org.apache.axis.client.ServiceFactory"/>
<property name="wsdlDocumentUrl" value="classpath://META-INF/myService.wsdl"/>
<property name="namespaceUri" value="http://com/myService"/>
<property name="endpointAddress" value="http://server/MyService"/>
<property name="serviceName" value="MyService"/>
<property name="portName" value="MyService"/>
<property name="serviceInterface" value="com.IMyService"/>
<property name="lookupServiceOnStartup" value="false"/>
</bean>
<bean id="myClient" class="com.MyServiceClient">
<property name="myService" ref="myService"/>
</bean>
爪哇:
public interface IMyService {
Foo getFoo();
}
public class MyServiceClient {
private IMyService myService;
public void setMyService(IMyService myService) {
this.myService = myService;
}
public void DoStuff() {
Foo foo = myService.getFoo();
...
}
}
对于自定义对象,您可能需要继承JaxRpcPortProxyFactoryBean:
public class MyServiceFactoryBean extends JaxRpcPortProxyFactoryBean {
protected void postProcessJaxRpcService(Service service) {
TypeMappingRegistry registry = service.getTypeMappingRegistry();
TypeMapping mapping = registry.createTypeMapping();
QName qName = new QName("http://com/myService", "Foo");
mapping.register(Foo.class, qName,
new BeanSerializerFactory(Foo.class, qName),
new BeanDeserializerFactory(Foo.class, qName));
}
}
我喜欢这一点的是不应该关心服务的实现的代码。测试变得轻而易举,您的课程的凝聚力很多更好。
答案 1 :(得分:0)
我们尝试使用复杂的对象和Axis。别!我们遇到了一些问题,Dotnet能够从WSDL创建一个正确的对象。我们最终只使用了原语,字符串和数组。如果某人有一个很好的使用复杂物体的方法,我很乐意听到它。