2008-10-30 2 views
1

В настоящее время я разрабатываю Java-приложение, которое обрабатывает веб-сервис SOAP.Использование сложных типов данных из Java в Axis webservice

Проблема заключается в том, что я разбираю WSDL [Parser объект от Apache Axis делает это для меня], и я создаю вызов.

Когда я пытаюсь вызвать его, я должен передать объект [], чтобы назначить параметры [взятые из действия 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 Фрагмент

 QTY = (String) call.invoke (
       new Object[]{ 
        new Object[]{ 
          tokenConexion.getToken(), 
          tokenConexion.getSign(), 
          tokenConexion.getCUIT() 
           } 
          }); 
+0

До сих пор я думаю, что решение может лежать на сериализации, но я продолжаю сталкиваться с «NoSerializerFound», даже когда я реализую io.Serializable. Кто-нибудь знает, могу ли я переопределить метод, чтобы рассказать ему, как его сериализовать? UPDATE: мне может потребоваться реализовать вместо этого несколько объектов из org.apache.axis.encoding.ser. Кто угодно? – 2008-10-31 18:02:10

+0

, как определено в Java API для интерфейса Serializable, вы можете переопределить способ его сериализации путем реализации частных функций writeObject (java.io.ObjectOutputStream) и readObject (java.io.ObjectInputStream) – Vinze 2008-12-17 15:50:16

ответ

1

Вы смотрели в используя что-то вроде функциональности прокси в Spring? Вы немного рассказываете об 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)); 
    } 
} 

Что мне нравится в том, что код что не должен заботиться о Обслуживание не. Тестирование становится легким, а сплоченность ваших классов - это много лучше.

0

Мы попытались использовать сложные объекты и ось. Не надо! У нас было множество проблем с Dotnet, способным создать правильный объект из WSDL. В итоге мы просто использовали примитивы, строки и массивы. Если у кого-то есть хороший метод использования сложного объекта, я бы с удовольствием его услышал.

Смежные вопросы