Использование сложных типов данных из Java в веб-сервисе Axis - PullRequest
1 голос
/ 30 октября 2008

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

Проблема заключается в том, что после анализа 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 ()
                                 }
                            });

Ответы [ 2 ]

1 голос
/ 30 октября 2008

Вы рассматривали возможность использования чего-то вроде прокси-функции Spring? Вы рассказываете ему немного о веб-сервисе в весеннем конфигурационном файле, и весь код вашего клиента имеет дело с интерфейсом, который вы создаете - ему даже не нужно знать, что на другой стороне есть веб-сервис! 1001 *

Пример конфигурации 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 голосов
/ 31 октября 2008

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

...