2017-08-22 1 views
0

Je reçois l'erreur suivante lorsque je tente de retourner un objet personnalisé avec webservice Axis:Axe ClassNotFoundException

aug 22, 2017 12:11:52 PM org.apache.axis.deployment.wsdd.WSDDService deployTypeMapping 
SEVERE: Unable to deploy typemapping: {http://server}Case 
java.lang.ClassNotFoundException: server._case 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1269) 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1104) 
    at org.apache.axis.utils.ClassUtils$2.run(ClassUtils.java:187) 

Il semble que le webservice ne peut pas trouver ma classe de cas, mais il est défini dans le fichier WSDL.

Ceci est mon code: Case:

package server; 

import java.io.Serializable; 

public class Case implements Serializable { 

    private static final long serialVersionUID = -1549174508068625157L; 
    private String id; 

    public Case() { 

    } 

    public Case(String id) { 
     this.id = id; 
    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

} 

CaseServiceImpl:

package server; 

public class CaseServiceImpl implements CaseService { 

    //This one works 
    @Override 
    public String hello(String message) { 
     return message; 
    } 

    //This one doesn't show up 
    @Override 
    public Case test() { 
     return new Case("TR-1"); 
    } 

} 

CaseServiceImpl.wsdl (généré automatiquement):

<?xml version="1.0" encoding="UTF-8"?> 
<wsdl:definitions targetNamespace="http://server" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://server" xmlns:intf="http://server" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<!--WSDL created by Apache Axis version: 1.4 
Built on Apr 22, 2006 (06:55:48 PDT)--> 
<wsdl:types> 
    <schema elementFormDefault="qualified" targetNamespace="http://server" xmlns="http://www.w3.org/2001/XMLSchema"> 
    <element name="test"> 
    <complexType/> 
    </element> 
    <element name="testResponse"> 
    <complexType> 
    <sequence> 
     <element name="testReturn" type="impl:Case"/> 
    </sequence> 
    </complexType> 
    </element> 
    <complexType name="Case"> 
    <sequence> 
    <element name="id" nillable="true" type="xsd:string"/> 
    </sequence> 
    </complexType> 
    <element name="hello"> 
    <complexType> 
    <sequence> 
     <element name="message" type="xsd:string"/> 
    </sequence> 
    </complexType> 
    </element> 
    <element name="helloResponse"> 
    <complexType> 
    <sequence> 
     <element name="helloReturn" type="xsd:string"/> 
    </sequence> 
    </complexType> 
    </element> 
    </schema> 
</wsdl:types> 

    <wsdl:message name="testResponse"> 

     <wsdl:part element="impl:testResponse" name="parameters"> 

     </wsdl:part> 

    </wsdl:message> 

    <wsdl:message name="helloResponse"> 

     <wsdl:part element="impl:helloResponse" name="parameters"> 

     </wsdl:part> 

    </wsdl:message> 

    <wsdl:message name="helloRequest"> 

     <wsdl:part element="impl:hello" name="parameters"> 

     </wsdl:part> 

    </wsdl:message> 

    <wsdl:message name="testRequest"> 

     <wsdl:part element="impl:test" name="parameters"> 

     </wsdl:part> 

    </wsdl:message> 

    <wsdl:portType name="CaseServiceImpl"> 

     <wsdl:operation name="test"> 

     <wsdl:input message="impl:testRequest" name="testRequest"> 

     </wsdl:input> 

     <wsdl:output message="impl:testResponse" name="testResponse"> 

     </wsdl:output> 

     </wsdl:operation> 

     <wsdl:operation name="hello"> 

     <wsdl:input message="impl:helloRequest" name="helloRequest"> 

     </wsdl:input> 

     <wsdl:output message="impl:helloResponse" name="helloResponse"> 

     </wsdl:output> 

     </wsdl:operation> 

    </wsdl:portType> 

    <wsdl:binding name="CaseServiceImplSoapBinding" type="impl:CaseServiceImpl"> 

     <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 

     <wsdl:operation name="test"> 

     <wsdlsoap:operation soapAction=""/> 

     <wsdl:input name="testRequest"> 

      <wsdlsoap:body use="literal"/> 

     </wsdl:input> 

     <wsdl:output name="testResponse"> 

      <wsdlsoap:body use="literal"/> 

     </wsdl:output> 

     </wsdl:operation> 

     <wsdl:operation name="hello"> 

     <wsdlsoap:operation soapAction=""/> 

     <wsdl:input name="helloRequest"> 

      <wsdlsoap:body use="literal"/> 

     </wsdl:input> 

     <wsdl:output name="helloResponse"> 

      <wsdlsoap:body use="literal"/> 

     </wsdl:output> 

     </wsdl:operation> 

    </wsdl:binding> 

    <wsdl:service name="CaseServiceImplService"> 

     <wsdl:port binding="impl:CaseServiceImplSoapBinding" name="CaseServiceImpl"> 

     <wsdlsoap:address location="http://localhost:8080/MORPOC_SOAP/services/CaseServiceImpl"/> 

     </wsdl:port> 

    </wsdl:service> 

</wsdl:definitions> 

Je sens que je suis absent quelque chose mais je ne sais pas quoi. Quelqu'un peut-il me pointer dans la bonne direction?

Répondre

-1

Apparemment, je ne peux pas utiliser le nom Case pour ma classe puisque case est réservé et il se décapitalise à un moment donné. Après avoir renommé la classe, cela fonctionne.

+0

Pourquoi ce downvoted? –

0

Il semble que vous ayez déjà trouvé une solution à votre problème, mais je publierai des étapes détaillées pour les lecteurs potentiels. J'espère que cela aidera aussi à améliorer votre solution, car je ne suis pas sûr que votre problème ne soit pas dans la dénomination de l'entité.

Préalables:

  1. Ant a été installé
  2. Axis2 a été téléchargé et variable d'environnement AXIS_HOME était correctement ensemble dans les variables d'environnement
  3. Toute application est disponible pour le déploiement de l'axe. Dans mon cas, j'ai utilisé Tomcat Apache Tomcat/7.0.41. Pour déployer l'axe, il suffit d'ajouter le dossier de l'axe précédemment téléchargé dans le dossier TOMCAT_HOME\webapps.

J'ai utilisé la même implémentation de bean et de service. Alors:

Case.java

package server; 

import java.io.Serializable; 

public class Case implements Serializable { 

    private static final long serialVersionUID = -1549174508068625157L; 
    private String id; 

    public Case() { 
    } 

    public Case(String id) { 
     this.id = id; 
    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 
} 

CaseService.java

package server; 

interface CaseService { 
    String hello(String message); 
    Case test(); 
} 

CaseServiceImpl.java

package server; 

public class CaseServiceImpl implements CaseService { 
    //This one works 
    @Override 
    public String hello(String message) { 
     return message; 
    } 

    //This one doesn't show up 
    @Override 
    public Case test() { 
     return new Case("TR-1"); 
    } 
} 

Une fois que vous avez créé cette infrastructure, vous pouvez générer wsdl en fonction de votre interface de service. Accédez au niveau supérieur au dossier dans lequel sont stockés les fichiers compilés (Case.class, CaseService.class, CaseServiceImpl.class).Dans notre cas, c'est: enter image description here

et exécuter la commande suivante:

%AXIS2_HOME%\bin\java2wsdl.bat -cp . -cn server.CaseService -of CaseService.wsdl 

Le résultat sera suit: enter image description here

Et nouveau fichier CaseService.wsdl sera créé.

<?xml version="1.0" encoding="UTF-8"?> 
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns="http://server" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ax21="http://server/xsd" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" targetNamespace="http://server"> 
    <wsdl:types> 
     <xs:schema xmlns:ax22="http://server/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://server"> 
      <xs:import namespace="http://server/xsd"/> 
      <xs:element name="test"> 
       <xs:complexType> 
        <xs:sequence/> 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="testResponse"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element minOccurs="0" name="return" nillable="true" type="ax22:Case"/> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="hello"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element minOccurs="0" name="args0" nillable="true" type="xs:string"/> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="helloResponse"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:schema> 
     <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://server/xsd"> 
      <xs:complexType name="Case"> 
       <xs:sequence> 
        <xs:element minOccurs="0" name="id" nillable="true" type="xs:string"/> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:schema> 
    </wsdl:types> 
    <wsdl:message name="testRequest"> 
     <wsdl:part name="parameters" element="ns:test"/> 
    </wsdl:message> 
    <wsdl:message name="testResponse"> 
     <wsdl:part name="parameters" element="ns:testResponse"/> 
    </wsdl:message> 
    <wsdl:message name="helloRequest"> 
     <wsdl:part name="parameters" element="ns:hello"/> 
    </wsdl:message> 
    <wsdl:message name="helloResponse"> 
     <wsdl:part name="parameters" element="ns:helloResponse"/> 
    </wsdl:message> 
    <wsdl:portType name="CaseServicePortType"> 
     <wsdl:operation name="test"> 
      <wsdl:input message="ns:testRequest" wsaw:Action="urn:test"/> 
      <wsdl:output message="ns:testResponse" wsaw:Action="urn:testResponse"/> 
     </wsdl:operation> 
     <wsdl:operation name="hello"> 
      <wsdl:input message="ns:helloRequest" wsaw:Action="urn:hello"/> 
      <wsdl:output message="ns:helloResponse" wsaw:Action="urn:helloResponse"/> 
     </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="CaseServiceSoap11Binding" type="ns:CaseServicePortType"> 
     <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> 
     <wsdl:operation name="test"> 
      <soap:operation soapAction="urn:test" style="document"/> 
      <wsdl:input> 
       <soap:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output> 
       <soap:body use="literal"/> 
      </wsdl:output> 
     </wsdl:operation> 
     <wsdl:operation name="hello"> 
      <soap:operation soapAction="urn:hello" style="document"/> 
      <wsdl:input> 
       <soap:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output> 
       <soap:body use="literal"/> 
      </wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:binding name="CaseServiceSoap12Binding" type="ns:CaseServicePortType"> 
     <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> 
     <wsdl:operation name="test"> 
      <soap12:operation soapAction="urn:test" style="document"/> 
      <wsdl:input> 
       <soap12:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output> 
       <soap12:body use="literal"/> 
      </wsdl:output> 
     </wsdl:operation> 
     <wsdl:operation name="hello"> 
      <soap12:operation soapAction="urn:hello" style="document"/> 
      <wsdl:input> 
       <soap12:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output> 
       <soap12:body use="literal"/> 
      </wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:binding name="CaseServiceHttpBinding" type="ns:CaseServicePortType"> 
     <http:binding verb="POST"/> 
     <wsdl:operation name="test"> 
      <http:operation location="test"/> 
      <wsdl:input> 
       <mime:content type="application/xml" part="parameters"/> 
      </wsdl:input> 
      <wsdl:output> 
       <mime:content type="application/xml" part="parameters"/> 
      </wsdl:output> 
     </wsdl:operation> 
     <wsdl:operation name="hello"> 
      <http:operation location="hello"/> 
      <wsdl:input> 
       <mime:content type="application/xml" part="parameters"/> 
      </wsdl:input> 
      <wsdl:output> 
       <mime:content type="application/xml" part="parameters"/> 
      </wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="CaseService"> 
     <wsdl:port name="CaseServiceHttpSoap11Endpoint" binding="ns:CaseServiceSoap11Binding"> 
      <soap:address location="http://localhost:8080/axis2/services/CaseService"/> 
     </wsdl:port> 
     <wsdl:port name="CaseServiceHttpSoap12Endpoint" binding="ns:CaseServiceSoap12Binding"> 
      <soap12:address location="http://localhost:8080/axis2/services/CaseService"/> 
     </wsdl:port> 
     <wsdl:port name="CaseServiceHttpEndpoint" binding="ns:CaseServiceHttpBinding"> 
      <http:address location="http://localhost:8080/axis2/services/CaseService"/> 
     </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

Nous sommes maintenant prêts à générer des composants WS. Dans le dossier où CaseService.wsdl a été généré exécuter la commande suivante:

%AXIS2_HOME%\bin\WSDL2Java -uri CaseService.wsdl -d adb -s -ss -sd -ssi -o service 

Le résultat sera suit: enter image description here

Et nouveau dossier service sera généré. Cette commande génère également un squelette pour vos méthodes WS qui devrait être implémenté. Donc, ouvrez CaseServiceSkeleton.java et implémentez les méthodes hello et test. Résultat devrait être quelque chose comme ça:

package server; 

public class CaseServiceSkeleton implements CaseServiceSkeletonInterface { 
    public HelloResponse hello(Hello hello0) { 
     CaseService caseService = new CaseServiceImpl(); 
     String hello = caseService.hello(hello0.getArgs0()); 

     HelloResponse helloResponse = new HelloResponse(); 
     helloResponse.set_return(hello); 
     return helloResponse; 
    } 

    public TestResponse test(Test test2) { 
     CaseService caseService = new CaseServiceImpl(); 
     Case test = caseService.test(); 
     server.xsd.Case aCase = new server.xsd.Case(); 
     aCase.setId(test.getId()); 
     TestResponse testResponse = new TestResponse(); 
     testResponse.set_return(aCase); 
     return testResponse; 
    } 
} 

Parce que vous avez une dépendance à l'égard CaseService, CaseServiceImpl et Case (qui ont été générés au cours de l'étape 1) copier ces fichiers dans le même dossier dans lequel CaseServiceSkeleton.java a été généré. Vous êtes maintenant prêt à générer le fichier *.aar. Il sera utilisé pour le déploiement WS. Accédez au dossier service nouvellement généré et exécuter la commande ant:

ant -buildfile build.xml 

Le résultat sera suit: enter image description here

Et dans le dossier build\lib\ sera créé CaseService.aar. Pour une raison quelconque, Test.class n'a pas été automatiquement inclus dans le fichier *.aar, il est donc nécessaire de l'ajouter manuellement - copiez simplement Test.class du dossier build/classes dans le dossier CaseService.aar nouvellement généré dans le dossier server. Après toutes ces étapes dossier CaseService.aar\server devrait ressembler à ça: enter image description here

Maintenant, vous pouvez déployer sur l'axe - il suffit de le copier sur WEB-INF\services\ dans l'axe application web. Celui que vous démarrez le nouveau serveur d'applications doit apparaître. Allez au http://your_host:your_port/axis_application_name/services/listServices. Si le déploiement a la page suivante devrait apparaître avec succès: enter image description here

service

Invocation

Il y a beaucoup de façons comment invoce les services fournis. Dans notre cas, nous utiliserons les talons de client générés.Pour générer le client s'il vous plaît utilisez la commande suivante à partir du dossier avec le fichier wsdl:

%AXIS2_HOME%\bin\WSDL2Java -uri CaseService.wsdl -d adb –o client 

Le résultat sera suit: enter image description here

Cette commande va générer le dossier src avec deux fichiers: CaseServiceStub.java et CaseServiceCallbackHandler.java. Ces fichiers seront utilisés par l'application cliente. Maintenant, nous sommes prêts pour la création de l'application client lui-même:

Client.java

package client; 

import org.apache.axis2.AxisFault; 

public class Client { 
    public static void main(String... args) { 
     try { 
      CaseServiceStub stub = new CaseServiceStub("http://localhost:8080/axis/services/CaseService"); 
      invokeHelloMethod(stub); 
      invokeTestMethod(stub); 
     } catch (AxisFault axisFault) { 
      axisFault.printStackTrace(); 
     } 
    } 

    public static void invokeHelloMethod(CaseServiceStub stub) { 
     try { 
      CaseServiceStub.Hello request = new CaseServiceStub.Hello(); 
      request.setArgs0("Hello World"); 

      CaseServiceStub.HelloResponse response = stub.hello(request); 
      System.out.println("Hello method says: " + response.get_return()); 
     } catch (java.rmi.RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void invokeTestMethod(CaseServiceStub stub) { 
     try { 
      CaseServiceStub.Test request = new CaseServiceStub.Test(); 
      CaseServiceStub.TestResponse response = stub.test(request); 
      System.out.println("Test method says: " + response.get_return().getId()); 
     } catch (java.rmi.RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Ne pas oublier de changer WS url lors de la création de l'objet CaseServiceStub. En résultat après l'exécution de cette classe, vous devez obtenir la sortie suivante:

Hello method says: Hello World 
Test method says: TR-1 

Espérons que cela aide les gens à exécuter votre exemple :)