JAX-WS Commons를 사용하여 Spring에서 작업하도록 JAX-WS를 어떻게 구성합니까?
-
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
요컨대, 수지 3 배는 XSD-Unaware Parser와 함께 배송되며 Apache Xerces 또는 다른 구문 분석기로 교체해야합니다 (위 포럼 게시물 참조).
=========================
다음 Bean 정의는 Spring Jax-Ws가 작동하게됩니다 ( "멍청한"Xbean / Namespace Magic을 사용하지 않고). 이것에 의해, 나는 소스를 읽고 사용할 올바른 클래스를 알아 내야했다 - 때로는 의도적으로 내가 알고있는 속성 값을 제공함으로써 (예 : 유효하지 않은 클래스와 같은 - 이것은 스택 추적을 볼 수 있었다. 콩 클래스로 다시 연결하십시오).
<?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>
다른 모든 것은 위에 링크 된 자습서에서와 같이 (web.xml에 Jax-Ws Spring Servlet을 추가하고, 웹 서비스 요청이 JAXWS 서플렛으로 라우팅되도록 서블릿 필터를 추가하십시오).
프록시 웹 서비스 인스턴스 (따라서 종속성 주입, AOP 등)를 사용하는 핵심은 proxyTargetClass = "True"를 설정하여 JDK 동적 프록시 대신 CGLIB 프록시를 강제로 설정하는 것입니다 (인터페이스가 필요). Jax-Ws는 어떤 이유로 든 인터페이스를 좋아하지 않는 것 같습니다.
나는 이것이 어떤 도움이되기를 바랍니다!
안부, 레
다른 팁
LES2 : 구현이 가장 복잡해 보입니다. SpringbeanAutoWiringsUpport의 간단한 사용에 문제가있는 것은 다음과 같습니다. 봄 매뉴얼