Клиент Axis2 Неожиданное субэлементное яблоко - PullRequest
0 голосов
/ 02 февраля 2011

Я разработал как серверное, так и клиентское приложение, используя Axis2 версии 1.5.4, Java 1.6, и сервер развернут на tomcat 6. Сервисы объявляются с использованием аннотаций, поэтому файлов .aar или чего-то в этом роде нет.WSDL был создан автоматически Axis2.Клиент был создан с использованием заглушек и параметров, сгенерированных WSDL2Java с помощью команды:

%axis2_home%\bin\WSDL2Java -p com.audaxys.leaseclient.servicestub.generic -d adb -Eosv -s -g -u -uw -or -sp -S src/main/java -R src/main/resources --noBuildXML -uri %baseurl%/AppleFinderService.Rpc?wsdl

Когда клиентское приложение вызывает метод public Apple loadApple(String appType), сервер отвечает, возвращая один экземпляр класса Apple, но клиент не можетдесериализовать ответ и выдает это исключение.

Если вы знаете, как это исправить, не могли бы вы поделиться им со мной?Любые подсказки будут с благодарностью, на самом деле!

Полная трассировка стека:

org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement apple
  at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
  at com.audaxys.leaseclient.servicestub.generic.AppleFinderServiceStub.fromOM(AppleFinderServiceStub.java:1015)
  at com.audaxys.leaseclient.servicestub.generic.AppleFinderServiceStub.loadApple(AppleFinderServiceStub.java:343)
  at com.audaxys.lease.ws.client.TestDummyServices.testLoadApple(TestDummyServices.java:107)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  at java.lang.reflect.Method.invoke(Method.java:597)
  at junit.framework.TestCase.runTest(TestCase.java:154)
  at junit.framework.TestCase.runBare(TestCase.java:127)
  at junit.framework.TestResult$1.protect(TestResult.java:106)
  at junit.framework.TestResult.runProtected(TestResult.java:124)
  at junit.framework.TestResult.run(TestResult.java:109)
  at junit.framework.TestCase.run(TestCase.java:118)
  at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
  at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
  at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.Exception: org.apache.axis2.databinding.ADBException: Unexpected subelement apple
  at com.audaxys.www.namespaces.leasews.LoadAppleResponse$Factory.parse(LoadAppleResponse.java:454)
  at com.audaxys.leaseclient.servicestub.generic.AppleFinderServiceStub.fromOM(AppleFinderServiceStub.java:981)
  ... 18 more
Caused by: org.apache.axis2.databinding.ADBException: Unexpected subelement apple
  at com.audaxys.www.namespaces.leasews.LoadAppleResponse$Factory.parse(LoadAppleResponse.java:448)
  ... 19 more

ServiceDeclaration

package com.audaxys.lease.model.generic;
import .....;

@WebService(name="AppleFinderService", serviceName="AppleFinderService", portName="Rpc", targetNamespace="http://www.audaxys.com/namespaces/leasews")
@SOAPBinding(style = Style.RPC, parameterStyle = ParameterStyle.WRAPPED)
public class AppleFinderImpl {

    @WebResult(name = "apple")
    public Apple loadApple(String appType) {
        Apple a = new Apple();
        a.setAppleType(appType);
        return a;
    }
}

Apple класс

package com.audaxys.lease.model.generic;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(namespace="http://www.audaxys.com/namespaces/leasews")
public class Apple {

  private String appleType;

  public Apple() {
    super();
  }

  public String getAppleType() {
    return appleType;
  }
  public void setAppleType(String appleType) {
    this.appleType = appleType;
  }
}

WSDL

<?xml version="1.0" encoding="UTF-8" ?>
<definitions name="AppleFinderService" targetNamespace="http://www.audaxys.com/namespaces/leasews" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.audaxys.com/namespaces/leasews" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://jaxb.dev.java.net/array">
  <types>
    <xsd:schema>
      <xsd:import namespace="http://www.audaxys.com/namespaces/leasews" schemaLocation="AppleFinderService.Rpc?xsd=AppleFinderService_schema1.xsd" /> 
    </xsd:schema>
    <xsd:schema>
      <xsd:import namespace="http://jaxb.dev.java.net/array" schemaLocation="AppleFinderService.Rpc?xsd=AppleFinderService_schema2.xsd" /> 
    </xsd:schema>
  </types>
  <message name="loadAppleResponse">
    <part name="apple" type="tns:apple" /> 
  </message>
  <message name="getAppleArray">
    <part name="arg0" type="xsd:string" /> 
  </message>
  <message name="loadApple">
    <part name="arg0" type="xsd:string" /> 
  </message>
  <portType name="AppleFinderService">
    <operation name="getAppleArray">
      <input message="tns:getAppleArray" /> 
      <output message="tns:getAppleArrayResponse" /> 
    </operation>
    <operation name="loadApple">
      <input message="tns:loadApple" /> 
      <output message="tns:loadAppleResponse" /> 
    </operation>
  </portType>
  <binding name="RpcBinding" type="tns:AppleFinderService">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> 
    <operation name="getAppleArray">
      <soap:operation soapAction="" /> 
      <input>
        <soap:body use="literal" namespace="http://www.audaxys.com/namespaces/leasews" /> 
      </input>
      <output>
        <soap:body use="literal" namespace="http://www.audaxys.com/namespaces/leasews" /> 
      </output>
    </operation>
    <operation name="loadApple">
      <soap:operation soapAction="" /> 
      <input>
        <soap:body use="literal" namespace="http://www.audaxys.com/namespaces/leasews" /> 
      </input>
      <output>
        <soap:body use="literal" namespace="http://www.audaxys.com/namespaces/leasews" /> 
      </output>
    </operation>
  </binding>
  <service name="AppleFinderService">
    <port name="Rpc" binding="tns:RpcBinding">
      <soap:address location="http://10.10.5.25:8080/lease.services/soap/services/AppleFinderService.Rpc/" /> 
    </port>
  </service>
</definitions>

XSD

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.audaxys.com/namespaces/leasews" attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://www.audaxys.com/namespaces/leasews">
  <xs:element name="apple" type="tns:apple" /> 
  <xs:complexType name="apple">
    <xs:sequence>
      <xs:element minOccurs="0" name="appleType" type="xs:string" /> 
    </xs:sequence>
  </xs:complexType>
  <xs:complexType final="#all" name="appleArray">
    <xs:sequence>
      <xs:element maxOccurs="unbounded" minOccurs="0" name="item" nillable="true" type="tns:apple" /> 
    </xs:sequence>
  </xs:complexType>
</xs:schema>

Запрос

<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>
    <loadApple xmlns="http://www.audaxys.com/namespaces/leasews">
      <arg0>Red</arg0>
    </loadApple>
  </soapenv:Body>
</soapenv:Envelope>

Ответ

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>
    <rpcOp:loadAppleResponse xmlns:rpcOp="http://www.audaxys.com/namespaces/leasews">
      <rpcOp:apple xmlns:ns3="http://com.audaxys.lease/" xmlns="">
        <appleType>Red</appleType>
      </rpcOp:apple>
    </rpcOp:loadAppleResponse>
  </soapenv:Body>
</soapenv:Envelope>

Ответы [ 2 ]

1 голос
/ 15 апреля 2011

Ваш пост трудно читать, но я считаю, что проблема в WSDL и XSD.У вас есть элемент, complexType и часть сообщения с одинаковым именем «яблоко».Я бы попробовал переработать WSDL в соответствии с соглашением здесь :

<element name="Apple" type="tns:AppleType"/>
<complexType name="AppleType">
...
</complexType>

<message name="loadAppleResponse">
  <part name="apple" element="tns:Apple"/>        
</message>
0 голосов
/ 07 марта 2012

Я столкнулся с подобной проблемой, я аннотировал EJB SLSB, используя API JAX-WS, и использовал RPC в качестве стиля привязки SOAP. Развернул EJB в JBoss5.1, а JBOSSWS генерирует WSDL.* Когда я тестировал клиент Webis by Axis1, он работал нормально, но во время тестирования с клиентом Axis2 запрос был отправлен на сервер, и даже транзакции с БД также были успешными.

Но когда ответ пришел к клиенту, он говорит о неожиданном возврате субэлемента и так далее.Затем я изменил стиль привязки SOAP, он работал с Axis2.

 @WebService 
  @SOAPBinding(style=Style.DOCUMENT, parameterStyle = ParameterStyle.WRAPPED)
  public interface BillingAccountManagement_SEI { // TODO}
...