Come si configura JAX-WS per lavorare con la Primavera utilizzando comuni JAX-WS?
-
13-09-2019 - |
Domanda
In web.xml ho il seguente:
<servlet>
<description>JAX-WS endpoint - EARM</description>
<display-name>jaxws-servlet</display-name>
<servlet-name>jaxws-servlet</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSSpringServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>jaxws-servlet</servlet-name>
<url-pattern>/webServices/*</url-pattern>
</servlet-mapping>
Nel mio contesto di applicazione ho le seguenti definizioni:
<bean id="helloService" class="com.foo.HelloServiceImpl">
<property name="regularService" ref="regularService" />
</bean>
<wss:binding url="/webServices/helloService" service="#helloService" />
ho un NullPointerException
quando si cerca di accedere al WSDL:
java.lang.NullPointerException
at com.sun.xml.ws.transport.http.HttpAdapter.<init>(HttpAdapter.java:145)
at com.sun.xml.ws.transport.http.servlet.ServletAdapter.<init>(ServletAdapter.java:76)
at com.sun.xml.ws.transport.http.servlet.ServletAdapterList.createHttpAdapter(ServletAdapterList.java:5 0)
at com.sun.xml.ws.transport.http.servlet.ServletAdapterList.createHttpAdapter(ServletAdapterList.java:4 7)
at com.sun.xml.ws.transport.http.HttpAdapterList.createAdapter(HttpAdapterList.java:73)
at com.sun.xml.ws.transport.http.servlet.SpringBinding.create(SpringBinding.java:24)
at com.sun.xml.ws.transport.http.servlet.WSSpringServlet.init(WSSpringServlet.java:46)
Strano ... sembra essere un errore di configurazione, ma l'aggeggio appena muore con un !!!!!!!! NullPointerException
non viene fornita alcuna registrazione.
Implementato in resina.
Soluzione
UPDATE: Ho finalmente capito la vera risposta a questo problema ed ha inviato qui: http://forum.springsource.org/showthread.php?p=286701
In breve, le navi resina 3x con un XSD-ignaro parser e si deve sostituirlo con Apache Xerces o qualche altro parser (vedi sopra post sul forum).
=========================
Le seguenti definizioni di fagioli ottengono primavera JAX-WS di lavoro (senza usare la magia xbean / namespace "stupido"). Per venire da questo, ho dovuto leggere la fonte e capire le classi corrette da utilizzare - a volte fornendo intenzionalmente un valore di proprietà che sapevo avrebbe causato un'eccezione (come ad esempio una classe di valido - Questo mi ha permesso di vedere la traccia dello stack che riconducono alla classe di fagioli).
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="webServiceMethodInterceptor"
class="com.webservice.util.interceptors.WebServiceMethodInterceptor">
<property name="userId" value="hello" />
<property name="password" value="world" />
<property name="roles" value="ROLE_ANONYMOUS,ROLE_MICKEY_MOUSE" />
</bean>
<bean id="webServiceLoggingInterceptor"
class="com.webservice.util.interceptors.LoggingInterceptor">
<property name="level" value="debug" />
</bean>
<bean id="webServiceExceptionTranslator"
class="com.webservice.util.interceptors.WebServiceExceptionTranslator"/>
<!-- The list of interceptors to apply to all web methods -->
<bean id="webServiceInterceptors" class="java.util.LinkedList">
<constructor-arg index="0">
<list>
<value>webServiceExceptionTranslator</value>
<value>webServiceLoggingInterceptor</value>
<value>webServiceMethodInterceptor</value>
</list>
</constructor-arg>
</bean>
<!-- Proxied ExampleWebService -->
<bean id="exampleWebService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<bean class="com.webservice.ExampleWebServiceImpl">
<!-- TODO: add dependencies for web service here, for example:
<property name="someService" ref="someService" />
-->
</bean>
</property>
<property name="interceptorNames" ref="webServiceInterceptors" />
<property name="proxyTargetClass" value="true" />
</bean>
<!-- JAX-WS Endpoint for ExampleWebService -->
<bean class="com.sun.xml.ws.transport.http.servlet.SpringBinding">
<property name="url" value="/webServices/exampleService" />
<property name="service">
<bean class="org.jvnet.jax_ws_commons.spring.SpringService">
<property name="bean">
<ref local="exampleWebService" />
</property>
<property name="impl"
value="com.webservice.ExampleWebServiceImpl" />
</bean>
</property>
</bean>
Tutto il resto è come nel tutorial linkato sopra (si aggiunge la Primavera servlet JAX-WS in web.xml, aggiungere il filtro servlet in modo che le richieste di servizi web vengono indirizzati al jaxws servlet).
La chiave per usare l'istanza di servizio web proxy (permettendo così la dipendenza iniezione, AOP, ecc) tramontava proxyTargetClass = "true" per forzare un proxy CGLIB invece di un proxy dinamico JDK (che richiede un'interfaccia). JAX-WS sembra non come interfacce per qualche ragione.
Spero che questo aiuta qualcuno!
Saluti, LES
Altri suggerimenti
les2: L'implementazione sembra più complessa. Cosa c'è di sbagliato con l'utilizzo semplice di SpringBeanAutowiringSupport, come descritto in manuale Primavera