# "Wrapper class   is not found. Have you run APT to generate them?"



## hupfdule (15. Feb 2010)

Hallo,

ich habe eine WSDL-Datei eines WebService, den ich nutze. Um zum Testen keine Verbindung zum echten Webservice zu benötigen, habe ich mir einen Stub erstellt, der sich nach außen wie der echte WebService verhalten soll. Prinzipiell hat das funktioniert, jedoch möchte ich diesen nun lokal als WebService veröffentlichen und bekomme folgenden Fehler:


```
Exception in thread "main" com.sun.xml.internal.ws.model.RuntimeModelerException: runtime modeler error: Wrapper class my.webservice.jaxws.IsAlive is not found. Have you run APT to generate them?
        at com.sun.xml.internal.ws.model.RuntimeModeler.getClass(RuntimeModeler.java:256)
        at com.sun.xml.internal.ws.model.RuntimeModeler.processDocWrappedMethod(RuntimeModeler.java:567)
        at com.sun.xml.internal.ws.model.RuntimeModeler.processMethod(RuntimeModeler.java:514)
        at com.sun.xml.internal.ws.model.RuntimeModeler.processClass(RuntimeModeler.java:341)
        at com.sun.xml.internal.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:227)
        at com.sun.xml.internal.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:308)
        at com.sun.xml.internal.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:174)
        at com.sun.xml.internal.ws.api.server.WSEndpoint.create(WSEndpoint.java:420)
        at com.sun.xml.internal.ws.api.server.WSEndpoint.create(WSEndpoint.java:439)
        at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.createEndpoint(EndpointImpl.java:208)
        at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:138)
        at com.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:92)
        at javax.xml.ws.Endpoint.publish(Endpoint.java:170)
        at my.webstub.StubStarter.main(StubStarter.java:31)
```

Der Aufruf ist folgender:

```
public class StubStarter {
    public static void main(String[] args) {
        Endpoint endpoint = Endpoint.publish("http://localhost/MyWebService/services/MyWebService", new MyWebServiceStub());
    }
}
```

Das Interface MyWebService wurde von der WSDL bereitgestellt und per jax-ws generiert. MyWebServiceStub ist die Stub-Klasse, die den echten WebService imitieren soll. isAlive ist eine Methode, die vom WebService bereitgestellt wird und für die auch von jax-ws die Klasse IsAlive generiert wurde. Fragwürdig ist jedoch das package: my.webservice.jaxws.IsAlive. Tatsächlich befindet sich die Klasse in my.webservice.IsAlive.

Jetzt fehlt mir hier etwas der Ansatzpunkt, wo ich nach dem Problem suchen könnte. Offenbar wird hier das falsche Package erwartet. Woher kommt das "jaxws" im Packagenamen? Was kann ich tun, um mein Problem zu lösen?


----------



## musiKk (15. Feb 2010)

Das kommt aus der JAX-WS-Spezifikation. Führe einfach mal apt aus, wie es vorgeschlagen wird. Dabei werden die entsprechenden Klassen im richtigen Package generiert. Oder Du informierst Dich, wie der Package-Name manuell angepasst werden kann, das weiß ich gerade nicht.


----------



## hupfdule (15. Feb 2010)

musiKk hat gesagt.:


> Das kommt aus der JAX-WS-Spezifikation. Führe einfach mal apt aus, wie es vorgeschlagen wird. Dabei werden die entsprechenden Klassen im richtigen Package generiert.


So wie ich das ganze verstehe, ist apt doch nur notwendig, wenn ich auch die WSDL-Datei generieren möchte. (siehe [1]) Diese habe ich ja bereits. Ebenso habe ich die generierten Artifakte (so auch my.webservice.IsAlive)
Generieren lasse ich diese per wsimport (über maven).



> Oder Du informierst Dich, wie der Package-Name manuell angepasst werden kann, das weiß ich gerade nicht.


Also bei der Generierung ist der Package-Name schon korrekt. So soll er sein. Mich wundert, warum er während der Laufzeit, beim Publizieren des WebService, das falsche Package verwendet. Mir würde helfen, wenn ich wüsste, wo ich _dort_ das korrekte Package angeben kann.


[1] Java(TM) API for XML Web Services (JAX-WS) 2.0 Tools


----------



## musiKk (15. Feb 2010)

Naja, apt generiert kein WSDL, das wird zu Laufzeit erzeugt.

Ich hatte mich auch nur kurz mit der "manuellen" Variante der WebServices beschäftigt. Da war es mir auch egal, ob die Klassen in einem jaxws-Package liegen mussten, da das sofort funktioniert hat. Gehts denn mit der Annotation [c]@RequestWrapper[/c]? Ich hab das nur mal kurz ausgetestet und da geht wohl auch was.

Ansonsten, wenn das nicht hilft, kann ich Dir vermutlich leider nicht weiterhelfen. Ich spiele in letzter Zeit nur noch mit dem Glassfish herum, da werden solche Dinge vereinfacht.


----------



## hupfdule (16. Feb 2010)

musiKk hat gesagt.:


> Gehts denn mit der Annotation [c]@RequestWrapper[/c]? Ich hab das nur mal kurz ausgetestet und da geht wohl auch was.


Tatsächlich. Mit den Annotationen @RequestWrapper und @ResponseWrapper für alle Methoden, werden die korrekten Packages genutzt.
Leider kommt da natürlich das nächste Problem. 


```
Exception in thread "main" javax.xml.ws.WebServiceException: class my.webservice.IsAlive do not have a property of the name arg0
        at com.sun.xml.internal.ws.server.sei.EndpointArgumentsBuilder$DocLit.<init>(EndpointArgumentsBuilder.java:480)
        at com.sun.xml.internal.ws.server.sei.EndpointMethodHandler.createArgumentsBuilder(EndpointMethodHandler.java:119)
        at com.sun.xml.internal.ws.server.sei.EndpointMethodHandler.<init>(EndpointMethodHandler.java:92)
        at com.sun.xml.internal.ws.server.sei.PayloadQNameBasedDispatcher.<init>(PayloadQNameBasedDispatcher.java:58)
        at com.sun.xml.internal.ws.server.sei.EndpointMethodDispatcherGetter.<init>(EndpointMethodDispatcherGetter.java:58)
        at com.sun.xml.internal.ws.server.sei.SEIInvokerTube.<init>(SEIInvokerTube.java:58)
        at com.sun.xml.internal.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:190)
        at com.sun.xml.internal.ws.api.server.WSEndpoint.create(WSEndpoint.java:420)
        at com.sun.xml.internal.ws.api.server.WSEndpoint.create(WSEndpoint.java:439)
        at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.createEndpoint(EndpointImpl.java:208)
        at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:138)
        at com.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:92)
        at javax.xml.ws.Endpoint.publish(Endpoint.java:170)
        at my.webstub.StubStarter.main(StubStarter.java:31)
Caused by: javax.xml.bind.JAXBException: arg0 is not a valid property on class my.webservice.IsAlive
        at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getElementPropertyAccessor(JAXBContextImpl.java:910)
        at com.sun.xml.internal.ws.server.sei.EndpointArgumentsBuilder$DocLit.<init>(EndpointArgumentsBuilder.java:469)
        ... 13 more
```

Da habe ich jetzt auch keine Möglichkeit gesehen, diese Argumentnamen anzugeben. Irgendwas mach ich da noch falsch. Schließlich sind diese ja alle bereits korrekt in der WSDL angegeben.



> Ansonsten, wenn das nicht hilft, kann ich Dir vermutlich leider nicht weiterhelfen. Ich spiele in letzter Zeit nur noch mit dem Glassfish herum, da werden solche Dinge vereinfacht.


Diesen im Glassfish zu deployen, wäre für mich auch ok. Diesen Versuch hatte ich auch bereits gemacht. Verfügbar war der Webservice. Beim ansprechen dessen jedoch kam es zu eben demselben Package-Fehler. Der Aufruf sah folgendermaßen aus:


```
final URL wsdlLocation = new URL("http://localhost:8080/stubweb/MyWebService?wsdl");
final QName qname= new QName("http://webservice.my/", "MyWebServiceStubService");
final MyWebServiceService serviceLocator = new MyWebServiceService(wsdlLocation, qname);
```

Wie gesagt, führt zu dem selben Fehler, den ich im Eingangspost beschrieben habe.
Trage ich beim meinem MyWebServiceStub die Annotationen @RequestWrapper und @ResponseWrapper ein, ist der WebService jedoch nicht mehr verfügbar. Das Deployen funktioniert, die Glassfish AdminConsole zeigt ihn auch als Webservice an, ein Test führt jedoch zur Fehlermeldung, dass der Service nicht verfügbar ist (ebenso beim eigentlichen Aufruf aus dem Code).

Ich würde mich freuen, wenn du mir hier noch ein paar Tipps geben könntest.


----------



## hupfdule (16. Feb 2010)

Als problematisch sehe ich auch, dass für meinen Stub ein völlig neues WSDL generiert wird.Das sieht schon deutlich anders aus, als das originale. Da kommen vermutlich auch die Inkompatibilitäten her.


----------

