Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JAVA][JAX-WS]WsServlet tries to load a non-existing class

Pagina: 1
Acties:

  • NDF82
  • Registratie: Januari 2002
  • Laatst online: 28-11 20:53

NDF82

Doomed Space Marine

Topicstarter
[JAVA][JAX-WS]WsServlet tries to load a non-existing class

Hi all,

Ik ben wat aan het testen met JAX-WS met een document/literal service definition. Zie hieronder:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions 
        xmlns="http://schemas.xmlsoap.org/wsdl/" 
        xmlns:asmb="http://api.mycompany.com" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
        targetNamespace="http://api.mycompany.com" 
        name="SOAPMessaging">
    <types>
        <xsd:schema>
            <xsd:import namespace="http://api.mycompany.com" schemaLocation="EquipmentError.xsd"/>
            <xsd:import namespace="http://api.mycompany.com" schemaLocation="EquipmentWarning.xsd"/>
        </xsd:schema>
    </types>
    <message name="EquipmentErrorMessage">
        <part name="message" element="asmb:EquipmentError"/>
    </message>
    <message name="EquipmentWarningMessage">
        <part name="message" element="asmb:EquipmentWarning"/>
    </message>
    <portType name="SOAPMessagingPortType">
        <operation name="processEquipmentError">
            <input message="asmb:EquipmentErrorMessage"/>
        </operation>
        <operation name="processEquipmentWarning">
            <input message="asmb:EquipmentWarningMessage"/>
        </operation>
    </portType>
    <binding name="SOAPMessagingPortBinding" type="asmb:SOAPMessagingPortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="processEquipmentError">
            <soap:operation/>
            <input>
                <soap:body use="literal"/>
            </input>
        </operation>
        <operation name="processEquipmentWarning">
            <soap:operation/>
            <input>
                <soap:body use="literal"/>
            </input>
        </operation>
    </binding>
    <service name="SOAPMessagingService">
        <port name="SOAPMessagingPort" binding="asmb:SOAPMessagingPortBinding">
            <soap:address location="http://localhost"/>
        </port>
    </service>
</definitions>


Het doel van deze test is het binden van extern aangeleverde messages naar wsdl:operations. De code generatie gaat goed, de volgende files worden gegenereerd:
code:
1
2
3
4
5
6
7
com.mycompany.api
 |-EquipmentError
 |-EquipmentWarning
 |-ObjectFactory
 |-package-info
 |-SOAPMessagingPortType
 |-SOAPMessagingService


Dit lijkt er goed uit te zien, alle message bindings(EquipmentError, EquipmentWarning), poprt bindings (SOAPMessagingPortType) en service bindings (SOAPMessagingService) worden gegenereerd. De WS-I Basic Profile conformance tools bevestigen dat deze definitie voldoet aan de Basic profile.

Echter, wanneer ik de service start in een Tomcat 5.5 omgeving wordt de volgende fout melding getoond:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
SEVERE: WSSERVLET11: failed to parse runtime descriptor: class: com.mycompany.ap
i.jaxws.ProcessEquipmentError could not be found
class: com.mycompany.api.jaxws.ProcessEquipmentError could not be found
        at com.sun.xml.ws.modeler.RuntimeModeler.getClass(RuntimeModeler.java:26
9)
        at com.sun.xml.ws.modeler.RuntimeModeler.processDocWrappedMethod(Runtime
Modeler.java:558)
        at com.sun.xml.ws.modeler.RuntimeModeler.processMethod(RuntimeModeler.ja
va:505)
        at com.sun.xml.ws.modeler.RuntimeModeler.processClass(RuntimeModeler.jav
a:353)
        at com.sun.xml.ws.modeler.RuntimeModeler.buildRuntimeModel(RuntimeModele
r.java:249)
        at com.sun.xml.ws.server.RuntimeEndpointInfo.createSEIModel(RuntimeEndpo
intInfo.java:168)
        at com.sun.xml.ws.server.RuntimeEndpointInfo.init(RuntimeEndpointInfo.ja
va:315)
        at com.sun.xml.ws.transport.http.servlet.WSServletContextListener.create
ModelAndMetadata(WSServletContextListener.java:197)
        at com.sun.xml.ws.transport.http.servlet.WSServletContextListener.contex
tInitialized(WSServletContextListener.java:117)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContex
t.java:3729)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4
187)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase
.java:759)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:73
9)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:524)

        at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.jav
a:904)
        at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.j
ava:867)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:474
)
        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1122)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java
:310)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(Lifecycl
eSupport.java:119)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1021)

        at org.apache.catalina.core.StandardHost.start(StandardHost.java:718)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1013)

        at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:442
)
        at org.apache.catalina.core.StandardService.start(StandardService.java:4
50)
        at org.apache.catalina.core.StandardServer.start(StandardServer.java:709
)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:551)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:432)


Ik kan deze fout niet verklaren omdat er bij document /literal geen sprake is van een ProcessEquipmentError element (dus ook geen binding), zie ook het voorbeeld request hieronder (gegenereerd met SoapUI):
XML:
1
2
3
4
5
6
7
8
9
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:api="http://api.mycompany.com">
   <soapenv:Header/>
   <soapenv:Body>
      <api:EquipmentError dateTime="?" errorId="?" errorInstanceId="?" laneList="?" zoneList="?">
         <!--Optional:-->
         <Extensions>?</Extensions>
      </api:EquipmentError>
   </soapenv:Body>
</soapenv:Envelope>


Welke Webservice expert kan mij op de goede web helpen?

Pentium 233MHz MMX + Diamond Monster 3D 3DFX Voodoo II


  • NDF82
  • Registratie: Januari 2002
  • Laatst online: 28-11 20:53

NDF82

Doomed Space Marine

Topicstarter
Niemand een idee?

Pentium 233MHz MMX + Diamond Monster 3D 3DFX Voodoo II


  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Ik vind het vreemd dat je operation elementen geen output element hebben. Levert de webservice geen enkele output? Misschien dat JAX-WS klassen met de operation naam genereert om de output in te stoppen...

Wie trösten wir uns, die Mörder aller Mörder?


  • NDF82
  • Registratie: Januari 2002
  • Laatst online: 28-11 20:53

NDF82

Doomed Space Marine

Topicstarter
Confusion schreef op maandag 10 september 2007 @ 08:38:
Ik vind het vreemd dat je operation elementen geen output element hebben. Levert de webservice geen enkele output?
De reden waarom er geen output gedefinieerd is, is omdat het een "one-way" (i.e. asynchronous) web service is. De enige response die nar de client gestuurd is, is een HTTP OK zonder payload.
Confusion schreef op maandag 10 september 2007 @ 08:38:
Misschien dat JAX-WS klassen met de operation naam genereert om de output in te stoppen...
Dit is volgens mij alleen in hte geval van RPC based webservices.

[ Voor 30% gewijzigd door NDF82 op 10-09-2007 09:42 ]

Pentium 233MHz MMX + Diamond Monster 3D 3DFX Voodoo II


  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

NDF82 schreef op maandag 10 september 2007 @ 09:41:
De reden waarom er geen output gedefinieerd is, is omdat het een "one-way" (i.e. asynchronous) web service is. De enige response die nar de client gestuurd is, is een HTTP OK zonder payload.
Het is niet vanzelfsprekend dat de webservice client daar mee om kan gaan. Ik heb geen ervaring met JAX-WS, maar wel met Axis, en daarin is het toch knop lastig om een webservice call 'void' terug te laten geven. Daar komt eigenlijk altijd weer een webservice gegenereerd object uit. Ik zou zeggen: definieer eens een dummy output message en kijk of dat helpt.

Wie trösten wir uns, die Mörder aller Mörder?


  • NDF82
  • Registratie: Januari 2002
  • Laatst online: 28-11 20:53

NDF82

Doomed Space Marine

Topicstarter
Het is inmiddels opgelost. Mijn webservice implementatie miste wat meta-data. Ik veronderstelde ten onrechte dat deze @runtime uit de wsdl file gehaald zou worden.
Ik had:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
@WebService
public class SOAPMessagingPortTypeImpl implements SOAPMessagingPortType {
    @Resource
    private WebServiceContext context;
    
    public void processEquipmentError(final EquipmentError message) {
        System.out.println(String.format("processEquipmentError(message=%s)", message));
    }

    public void processEquipmentWarning(final EquipmentWarning message) {
        System.out.println(String.format("processEquipmentError(message=%s)", message));
    }
}

Maar dit moest het zijn:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@WebService(serviceName = "SOAPMessagingService",
        portName="SOAPMessagingPort",
        endpointInterface = "com.mycompany.api.SOAPMessagingPortType",
        targetNamespace = "http://api.mycompany.com",
        wsdlLocation = "WEB-INF/wsdl/SOAPMessaging.wsdl")
public class SOAPMessagingPortTypeImpl implements SOAPMessagingPortType {
    @Resource
    private WebServiceContext context;
    
    public void processEquipmentError(final EquipmentError message) {
        System.out.println(String.format("processEquipmentError(message=%s)", message));
    }

    public void processEquipmentWarning(final EquipmentWarning message) {
        System.out.println(String.format("processEquipmentError(message=%s)", message));
    }
}

Overigens is het in Apache Axis ook mogelijk om "one way" web services toe te passen.

Pentium 233MHz MMX + Diamond Monster 3D 3DFX Voodoo II

Pagina: 1