Como você configurar JAX-WS para trabalhar com Primavera usando JAX-WS commons?
-
13-09-2019 - |
Pergunta
no web.xml Eu tenho o seguinte:
<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>
Na minha contexto de aplicação Eu tenho as seguintes definições:
<bean id="helloService" class="com.foo.HelloServiceImpl">
<property name="regularService" ref="regularService" />
</bean>
<wss:binding url="/webServices/helloService" service="#helloService" />
Eu recebo um NullPointerException
ao tentar acessar o 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)
Estranho ... parece ser um erro de configuração, mas o danado apenas morre com um NullPointerException
!!!!!!!! Nenhum registro é fornecido.
Implantado em resina.
Solução
UPDATE: eu finalmente descobri a verdadeira resposta a este problema e postou -lo aqui: http://forum.springsource.org/showthread.php?p=286701
Em suma, navios resina 3x com uma analisador XSD-inconsciente e você tem que substituí-lo com Apache Xerces ou algum outro analisador (veja acima post no fórum).
=========================
As seguintes definições de feijão obter a Primavera JAX-WS trabalhando (sem usar a magia xbean / namespace "estúpido"). Para vir por isso, eu tive que ler a fonte e descobrir as classes corretas para uso - por vezes, fornecendo intencionalmente um valor de propriedade que eu sabia que iria causar uma exceção (como uma classe inválida - isto me permitiu ver o rastreamento de pilha que levar de volta para a classe de feijão).
<?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>
Tudo o resto é como no tutorial relacionado acima (você adicionar o servlet JAX-WS Primavera em web.xml, adicionar o filtro servlet para que as solicitações de serviços web se encaminhado para o servlet jaxws).
A chave para usar a instância de serviço web com proxy (injeção permitindo assim a dependência, AOP, etc.) estava se pondo proxyTargetClass = "true" para forçar um proxy CGLIB em vez de um proxy dinâmico JDK (que requer uma interface). JAX-WS parece não como interfaces para algum motivo.
Espero que isso ajude alguém!
Saudações, LES
Outras dicas
les2: Sua implementação parece mais complexa. O que há de errado com simples uso de SpringBeanAutowiringSupport, conforme descrito em manual de Primavera