1

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

问题在于我解析了 WSDL [Apache Axis 的Parser对象为我完成了它],然后我创建了调用。

当我尝试调用它时,我必须传递一个 Object[] 来分配参数 [取自 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 ()
                                 }
                            });
4

2 回答 2

1

您是否考虑过使用诸如 Spring 的代理功能之类的东西?你在 spring 配置文件中告诉它一些关于 web 服务的信息,你所有的客户端代码必须处理的是你创建的接口——它甚至不必知道另一端有 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>

爪哇:

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

我喜欢这一点的是,不应该关心服务实现的代码不会。测试变得轻而易举,并且您的课程的凝聚力好得多。

于 2008-10-30T19:33:08.490 回答
0

我们尝试使用复杂的对象和轴。不!我们在 Dotnet 能够从 WSDL 创建正确的对象方面遇到了很多问题。我们最终只使用了原语、字符串和数组。如果有人有使用复杂对象的好方法,我很想听听。

于 2008-10-30T22:26:20.310 回答