كيف تكوين JAX-WS للعمل مع الربيع باستخدام المشاع JAX-WS؟

StackOverflow https://stackoverflow.com/questions/1463295

سؤال

في 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.

باختصار، يتم سفن الراتنج 3X باستخدام محلل XSD-Unaware وعليك استبدالها باستخدام Apache Xerces أو بعض المحللين الآخرين (انظر فوق منشور المنتدى أعلاه).

=========================

تعمل تعريفات الفاصوليا التالية على عمل الربيع JAX-WS (دون استخدام السحر "الغبي" السحرية السحرية). لكي تأتي بهذا، اضطررت إلى قراءة المصدر ومعرفة الفئات الصحيحة لاستخدامها - أحيانا من خلال توفير قيمة خاصية عمدا التي عرفتها ستتسبب استثناء (مثل فئة غير صالحة - سمح لي أن أرى تتبع المكدس الذي العودة إلى فئة الفول).

<?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>

كل شيء آخر هو كما هو الحال في البرنامج التعليمي المرتبط أعلاه (يمكنك إضافة Springlet Jax-WS Spring في Web.xml، أضف مرشح Servlet بحيث يتم توجيه طلبات خدمة الويب إلى Servlet Jaxws).

كان مفتاح استخدام مثيل خدمة الويب المقبأ (وبالتالي تمكين حقن التبعية، AOP، وما إلى ذلك) يحدد proxytargetclass = "True" لإجبار وكيل CGLIB بدلا من وكيل ديناميكي JDK (الذي يتطلب واجهة). يبدو أن Jax-WS لا يحب الواجهات لسبب ما.

آمل أن يساعد هذا بعضا!

التحيات، ليه

نصائح أخرى

LES2: تطبيقك يبدو أكثر تعقيدا. ما هو الخطأ في استخدام بسيط ل Springbeanautowiringsupport، كما هو موضح في دليل الربيع

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top