JAX-WS и spring. Не получается связать вместе.
От: brejnev Россия  
Дата: 05.02.08 10:58
Оценка:
Spring 2.0.6
JAX-WS 2.1

Написал web-сервис

@WebService
public class IncomingCallWS{

    @WebMethod
    public String receiveCall(...) {

    }

    public IncomingCallWS() {
        System.out.println(" ---- IncomingCallWS has created ---- ");
    }

    private HotLine hotLine;

    public HotLine getHotLine() {
        return hotLine;
    }

    public void setHotLine(HotLine hotLine_) {
        this.hotLine = hotLine_;
    }
}


Согласно quick-start https://jax-ws-commons.dev.java.net/nonav/spring/ сделал такое

web.xml
    <servlet>
        <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>/IncomingCallWSService</url-pattern>
    </servlet-mapping>


applicationContext.xml
    <bean id="hotLine" class="ru.izhnet.common.ccenter.HotLine">
<!-- некоторый бин, через который веб-сервис будет таскать данные. -->
...
    </bean>
    
    <bean id="IncomingCallWSService" scope="prototype" class="ru.izhnet.common.ccenter.ws.IncomingCallWS">
        <property name="hotLine" ref="hotLine"/>
    </bean>
    
    <wss:binding id="jax-ws.http" url="/IncomingCallWSService">
        <wss:service>
            <ws:service bean="#IncomingCallWSService" impl="ru.izhnet.common.ccenter.ws.IncomingCallWS"/>
        </wss:service>
    </wss:binding>


Деплою это в сервер приложений, запускаю веб сервис http://localhost:8081/Owl/IncomingCallWSService?WSDL. Работает, посылает строки или pojo.
Теперь мне нужно получить данные, которые предоставляет бин hotLine( описан в applicationContext). Так вот, он — null. По идее, spring создает бин веб-сервиса и передает ему указанный бин( в методах разместил log.warn, которые мне сообщают о том что творится). Получается так: при старте web-приложения все бины создаются, все нормально, однако, при обращении к веб-сервису бин веб-сервиса создается снова, но hotLine ему не передается( отсюда он null). Такое ощущение, что веб-сервис работает вне контекста spring.
Re: JAX-WS и spring. Не получается связать вместе.
От: Blazkowicz Россия  
Дата: 05.02.08 11:55
Оценка: 2 (1)
Здравствуйте, brejnev, Вы писали:


B>Деплою это в сервер приложений, запускаю веб сервис http://localhost:8081/Owl/IncomingCallWSService?WSDL. Работает, посылает строки или pojo.

B>Теперь мне нужно получить данные, которые предоставляет бин hotLine( описан в applicationContext). Так вот, он — null. По идее, spring создает бин веб-сервиса и передает ему указанный бин( в методах разместил log.warn, которые мне сообщают о том что творится). Получается так: при старте web-приложения все бины создаются, все нормально, однако, при обращении к веб-сервису бин веб-сервиса создается снова, но hotLine ему не передается( отсюда он null). Такое ощущение, что веб-сервис работает вне контекста spring.
B>

Я бы подключил к проекту исходники этой интеграции. Поставиль бряку в конструкторе IncomingCallWS. И посмотрел кто реально создает экзепмляр и как. Тогда будет видно почему так.
Re[2]: JAX-WS и spring. Не получается связать вместе.
От: Аноним  
Дата: 05.02.08 12:57
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Я бы подключил к проекту исходники этой интеграции. Поставиль бряку в конструкторе IncomingCallWS. И посмотрел кто реально создает экзепмляр и как. Тогда будет видно почему так.


Утянул исходники, jaxws-spring-1.8-sources.jar. Подключил к проекту( Netbeans 6: Свойства проекта->Libraries->Add jar/folder ).
Нашел в исходниках WSSpringServlet( т.к. он в web.xml указан), поставил бряк в конструкторе. Поставил бряк в конструкторе IncomingCallWS.

Что получилось.
1. В WSSpringServlet не зашел. Если я правильно все сделал.
2. При запуске приложения создается IncomingCallWS, ему передается бин HotLine.
3. При получении запроса от клиента:
а) если запрос получен первый раз, то создается новый экземпляр IncomingCallWS(HotLine не передается), срабатывает удаленный метод;
б) запрос повторный, у созданного в пункте а) бина дергается веб-метод.
Re[3]: JAX-WS и spring. Не получается связать вместе.
От: Blazkowicz Россия  
Дата: 05.02.08 13:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А> а) если запрос получен первый раз, то создается новый экземпляр IncomingCallWS(HotLine не передается)

Кем создается этот экземпляр? Посмотри по стэку, кто именно вызвал конструктор в этот раз.
Re[4]: JAX-WS и spring. Не получается связать вместе.
От: brejnev Россия  
Дата: 05.02.08 13:22
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Кем создается этот экземпляр? Посмотри по стэку, кто именно вызвал конструктор в этот раз.


Выкидываю экзепшн в конструкторе и сморю printStackTrace().

При загрузке веб-приложения
java.lang.NullPointerException
        at ru.izhnet.common.ccenter.ws.IncomingCallWS.<init>(IncomingCallWS.java:50)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:85)
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:756)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:721)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:384)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:270)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:261)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:109)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1099)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:861)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:421)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:215)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:127)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1099)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:861)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:421)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:156)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:287)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352)
        at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:244)
        at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:187)
        at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4515)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:5176)
        at com.sun.enterprise.web.WebModule.start(WebModule.java:327)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:973)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:957)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:688)
        at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1581)
....



При удаленном обращении
java.lang.NullPointerException
        at ru.izhnet.common.ccenter.ws.IncomingCallWS.<init>(IncomingCallWS.java:50)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at java.lang.Class.newInstance0(Class.java:355)
        at java.lang.Class.newInstance(Class.java:308)
        at com.sun.xml.ws.api.server.InstanceResolver.createNewInstance(InstanceResolver.java:215)
        at com.sun.enterprise.webservice.InstanceResolverImpl.<init>(InstanceResolverImpl.java:69)
        at com.sun.enterprise.webservice.JAXWSServlet.registerEndpoint(JAXWSServlet.java:390)
        at com.sun.enterprise.webservice.JAXWSServlet.doInit(JAXWSServlet.java:252)
        at com.sun.enterprise.webservice.JAXWSServlet.init(JAXWSServlet.java:113)
        at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1178)
        at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:832)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
        at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:271)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:202)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
        at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:206)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:150)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
        at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:270)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:637)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:568)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:813)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:339)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:261)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:212)
        at com.sun.enterprise.web.portunif.PortUnificationPipeline$PUTask.doTask(PortUnificationPipeline.java:361)
        at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)
        at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)
Re[5]: JAX-WS и spring. Не получается связать вместе.
От: Blazkowicz Россия  
Дата: 05.02.08 13:25
Оценка:
Здравствуйте, brejnev, Вы писали:

B>>Кем создается этот экземпляр? Посмотри по стэку, кто именно вызвал конструктор в этот раз.


B>Выкидываю экзепшн в конструкторе и сморю printStackTrace().


B>При удаленном обращении

B>
B>        at com.sun.enterprise.webservice.JAXWSServlet.registerEndpoint(JAXWSServlet.java:390)
B>        at com.sun.enterprise.webservice.JAXWSServlet.doInit(JAXWSServlet.java:252)
B>        at com.sun.enterprise.webservice.JAXWSServlet.init(JAXWSServlet.java:113)
B>


Вот собственно и разгадка. Почему здесь JAXWSServlet а не WSSpringServlet?
Re[6]: JAX-WS и spring. Не получается связать вместе.
От: brejnev Россия  
Дата: 05.02.08 13:49
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Вот собственно и разгадка. Почему здесь JAXWSServlet а не WSSpringServlet?


Угу, хотя в web.xml и указан WSSpringServlet. Погуглил, без результатов. Сейчас домой, завтра дальше копать буду.
Re[7]: JAX-WS и spring. Не получается связать вместе.
От: Blazkowicz Россия  
Дата: 05.02.08 13:53
Оценка:
Здравствуйте, brejnev, Вы писали:


B>>Вот собственно и разгадка. Почему здесь JAXWSServlet а не WSSpringServlet?

B>Угу, хотя в web.xml и указан WSSpringServlet. Погуглил, без результатов. Сейчас домой, завтра дальше копать буду.
А что там гуглить, где-то что-то не добилдил, где-то что-то не додеплоил.
Re[8]: JAX-WS и spring. Не получается связать вместе.
От: brejnev Россия  
Дата: 06.02.08 06:25
Оценка:
Здравствуйте, Blazkowicz, Вы писали:
B>А что там гуглить, где-то что-то не добилдил, где-то что-то не додеплоил.

Утро вечера мудренее
Вчера парился, ничего не получалось. Сегодня с утра все сделал, в сумме заняло меньше часа:
0) настроится на работу, налить чай
1) скачать spring 2.5 и прикрутить его к проекту заместо старого
2) пролистать мануал на тему что там нового.

Вот такой веб сервис

@WebService
@SOAPBinding(style = Style.RPC, use = Use.LITERAL, parameterStyle = ParameterStyle.WRAPPED)
public class IncomingCallWS extends SpringBeanAutowiringSupport {

    @Autowired
    private HotLine hotLine;

    @WebMethod
    public MyPojoObject receiveCall(...) {
      ...
    }

    public IncomingCallWS() {
    }

    public HotLine getHotLine() {
        return hotLine;
    }

    public void setHotLine(HotLine hotLine_) {
        this.hotLine = hotLine_;
    }
}


Больше ничего не писал, все работает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.