在Axis webservice中使用Java中的复杂数据类型

在Axis webservice中使用Java中的复杂数据类型,java,web-services,wsdl,axis,Java,Web Services,Wsdl,Axis,我目前正在开发一个Java应用程序来处理SOAP Web服务 问题在于我解析了WSDL[来自ApacheAxis的解析器对象为我做了这件事],然后创建了调用 当我试图调用它时,我必须传递一个对象[]来分配参数[取自WSDL的操作]。正常的操作很容易,但当我有自定义数据类型时,我无法让它为我填写。我试图传递Object[]{new Object{}},但它指定了第一个字段。我无法传递已处理的文件,因为它将“”更改为“-lt--gt”,而服务器无法识别它 这是WSDL的一个片段 您是否考虑过使用类似

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

问题在于我解析了WSDL[来自ApacheAxis的解析器对象为我做了这件事],然后创建了调用

当我试图调用它时,我必须传递一个对象[]来分配参数[取自WSDL的操作]。正常的操作很容易,但当我有自定义数据类型时,我无法让它为我填写。我试图传递Object[]{new Object{}},但它指定了第一个字段。我无法传递已处理的文件,因为它将“<>”更改为“-lt--gt”,而服务器无法识别它

这是WSDL的一个片段


您是否考虑过使用类似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>
对于自定义对象,您可能需要子类化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));
    }
}

我喜欢的是,那些不应该关心服务实现的代码不会。测试变得轻而易举,类的内聚性也更好。

您是否考虑过使用类似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>
对于自定义对象,您可能需要子类化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));
    }
}

我喜欢的是,那些不应该关心服务实现的代码不会。测试变得轻而易举,类的内聚性也更好。

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

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

我不想在我的简单应用程序中添加另一个框架。一定有人知道如何使用axis invoke。我不想在我的简单应用程序中添加其他框架。一定有人知道了如何使用axis调用。到目前为止,我认为解决方案可能在于序列化,但即使在实现io.Serializable时,我仍不断遇到“NoSerializerFound”。有人知道我是否可以重写一个方法来告诉它如何序列化它吗?更新:我可能不得不从org.apache.axis.encoding.ser实现一些对象。有人吗?正如Java API中为可序列化接口定义的那样,您可以通过实现私有函数writeObject(Java.io.ObjectOutputStream)和readObject(Java.io.ObjectInputStream)来覆盖序列化的方式。到目前为止,我认为解决方案可能在于序列化,然而,即使在实现io.Serializable时,我也会不断遇到“NoSerializerFound”。有人知道我是否可以重写一个方法来告诉它如何序列化它吗?更新:我可能不得不从org.apache.axis.encoding.ser实现一些对象。有人吗?正如Java API中为可序列化接口定义的那样,您可以通过实现私有函数writeObject(Java.io.ObjectOutputStream)和readObject(Java.io.ObjectInputStream)来重写序列化接口的方式
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));
    }
}