Как настроить jax-ws для работы с Spring, используя jax-ws commons?
-
13-09-2019 - |
Вопрос
В web.xml У меня есть следующее:
<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>
В контексте моего приложения у меня есть следующие определения:
<bean id="helloService" class="com.foo.HelloServiceImpl">
<property name="regularService" ref="regularService" />
</bean>
<wss:binding url="/webServices/helloService" service="#helloService" />
Я получаю NullPointerException
при попытке получить доступ к 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)
Странно ...похоже, это ошибка конфигурации, но проклятая штука просто умирает с NullPointerException
!!!!!!!!Ведение журнала не предусмотрено.
Развернутый в Смоле.
Решение
Обновить: Я наконец-то нашел реальный ответ на эту проблему и опубликовал это здесь: http://forum.springsource.org/showthread.php?p=286701
Короче говоря, Resin 3x поставляется с Анализатором, не поддерживающим XSD, и вам нужно заменить его Apache Xerces или каким-либо другим анализатором (см. Сообщение на форуме выше).
=========================
Следующие определения компонента заставляют Spring JAX-WS работать (без использования "глупой" магии xbean / namespace).Чтобы прийти к этому, мне пришлось прочитать исходный код и определить правильные классы для использования - иногда намеренно предоставляя значение свойства, которое, как я знал, вызовет исключение (например, недопустимый класс - это позволило мне увидеть трассировку стека, которая ведет обратно к классу bean).
<?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>
Все остальное, как в руководстве, на которое дана ссылка выше (вы добавляете сервлет JAX-WS Spring в web.xml , добавьте фильтр сервлетов, чтобы запросы веб-службы перенаправлялись на сервлет jaxws).
Ключом к использованию прокси-экземпляра веб-службы (таким образом, позволяя внедрение зависимостей, AOP и т.д.) Была установка proxyTargetClass="true" для принудительного использования прокси CGLIB вместо динамического прокси JDK (для которого требуется интерфейс).Похоже, JAX-WS по какой-то причине не нравятся интерфейсы.
Я надеюсь, что это кому-то поможет!
Regards, LES
Другие советы
ФАЙЛЫ 2:Ваша реализация кажется наиболее сложной.Что плохого в простом использовании SpringBeanAutowiringSupport, как описано в Пружинный ручной