gpt4 book ai didi

java - 在 Axis Web 服务中使用 Java 中的复杂数据类型

转载 作者:太空宇宙 更新时间:2023-11-04 09:01:31 25 4
gpt4 key购买 nike

我目前正在开发一个处理 SOAP Web 服务的 Java 应用程序。

问题在于我解析 WSDL [Apache Axis 中的 Parser 对象为我完成了这件事],并创建了调用。

当我尝试调用它时,我必须传递一个对象[]来分配参数[从 WSDL 的操作中获取]。正常的操作很简单,但是当我有自定义数据类型时,我无法让它为我填写。我尝试传递 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 ()
}
});

最佳答案

您是否考虑过使用 Spring 的代理功能之类的功能?你在 Spring 配置文件中告诉它一些关于 Web 服务的信息,你的所有客户端代码必须处理的就是你创建的接口(interface) - 它甚至不必知道另一端有一个 Web 服务!

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>

Java:

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));
}
}

我喜欢这个的原因是代码不应该关心服务的实现。测试变得轻而易举,并且类的凝聚力大大更好。

关于java - 在 Axis Web 服务中使用 Java 中的复杂数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/251396/

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