Вопрос по jax-ws, spring – Веб-сервис JAX WS не принимает Spring Bean из applicationcontext, поэтому выдает исключение нулевого указателя

6

Привет я получил веб-сервис и работает, я использовал jax ws. Я использовал Spring, чтобы иметь возможность использовать bean-компоненты с Autowired и другие вещи, которые Spring выдает как инъекцию значения свойства в applicationContext.xml.

У меня есть нижеприведенная весенняя запись applicationcontext.xml:

      


В классе конечной точки веб-сервиса я сделал:

@Autowired private MyBeanProperty myProperty;

И у меня есть метод:

public String getSize() {

return myProperty.getSize();

}

К сожалению, когда я вызываю метод, он не получает никакого значения и выбрасывает nullpointerexception.

PS: я использовал soapUI для запуска wsdl веб-сервиса и вызвал метод.

Работает ли веб-служба до того, как Spring создаст bean-компоненты?

Даффмо

Да, я использовал компонентное сканирование в applicationContext. И у меня есть слушатель загрузчика контекста, как показано ниже в web.xml. Пожалуйста, помогите мне..

Вот мое полное объяснение кода с кодом

Я использую JAX-WS и Spring и пытаюсь настроить несколько Web-сервисов, которые должны работать на Tomcat 7. Я использую Maven в качестве инструмента для сборки, поэтому я просто перечисляю здесь две свои зависимости:


   
      org.springframework
      spring-web
      3.0.5.RELEASE
   

     
    
      com.sun.xml.ws
      jaxws-rt
      2.1.3
    

    

мои классы обслуживания расположены в com.test.services и называются TestService & HelloWorldService и выглядит следующим образом:

package com.test.services;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService( name = "Test", serviceName = "TestService" )
public class TestService {

  @WebMethod
  public String getTest() {
    return "Test";
  }

}

это мой web.xml:



  toolbox
  testing webservices
  
    com.sun.xml.ws.transport.http.servlet.WSServletContextListener
  
  
    jaxws-servlet
    com.sun.xml.ws.transport.http.servlet.WSServlet
    1
  
  
    jaxws-servlet
    /testservice
  
  
    jaxws-servlet
    /helloworldservice
  
  
    10
  

а это мой sun-jaxws.xml:



    
    

Это прекрасно работает, и я могу получить доступ к сервисам, указав в своем браузере [url]HTTP: // локальный: 8080 / набор инструментов / TestService [/ URL] соответственно [url]HTTP: // локальный: 8080 / набор инструментов / helloworldservice [/ URL], Однако поддержка Spring явно не активирована.

Я попробовал следующее, которое только что оставило HelloWorldService доступным: web.xml:



  toolbox
  
    30
  
  
    org.springframework.web.context.ContextLoaderListener
  

и applicationContext.xml:


  
  
    
  
 

кроме того, я аннотировал оба класса Service аннотацией @Service. Как я упоминал ранее, здесь публикуется только первый алфавитный веб-сервис, поэтому HelloWorldService. Также он меняет URL, так как сервис теперь доступен как [url]HTTP: // локальный: 8080 / [/ URL] а не [URL]HTTP: // локальный: 8080 / набор инструментов / helloworldservice [/ URL], Ведение журнала Tomcat показывает, что Spring Context загружает оба класса как бины Spring. Есть ли у вас какие-либо идеи или предложения о том, как включить поддержку Spring при сохранении доступности обеих служб?

Ваш Ответ

5   ответов
5

Не нужно также использовать ApplicationContext, если вы делаете следующие вещи

  1. Аннотируйте свой класс обслуживания с @Service
  2. Класс обслуживания должен расширятьсяSpringBeanAutowiringSupport».

Пожалуйста, посмотрите на следующий фрагмент.

@org.springframework.stereotype.Service
@javax.jws.WebService (endpointInterface="a.b.c.MyPort", 
            targetNamespace="http://a.b.co.in/Retail/MyService/V1", 
            serviceName="MyService", 
            portName="MyServicePort", 
            wsdlLocation="wsdl/MyService.wsdl")
public class MyServiceBindingImpl extends org.springframework.web.context.support.SpringBeanAutowiringSupport{
Будет ли это создавать бин как одиночный объект или объект для каждого запроса? Zeus
Это создаст одноэлементный объект Hemanth
6

Здесь ответили, В конечном счете, ничего не сработало, кроме добавления приведенного ниже кода в сервис.

    @PostConstruct
public void init() {
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}
Это должен быть принятый ответ. vault
3

Я получил ту же проблему, чтобы решить ее, я запустил слушатель jaxws после весеннего слушателя:

    
        org.springframework.web.context.ContextLoaderListener
    
     
        com.sun.xml.ws.transport.http.servlet.WSServletContextListener
    

Надеюсь, поможет

0

Я думаю это'Более вероятно, что ваш Spring-контекст не был загружен и сделан доступным для веб-службы. Как ты это сделал?

Вы должны иметьContextLoaderListener настроен вweb.xml для WAR, в которой развернут веб-сервис. Вы сказали ему, где загрузить контекст Spring? Вы используете компонентное сканирование?

http://renidev.wordpress.com/2009/02/02/how-to-use-springs-context-component-scan-and-annotation/

2

Ваш TestService (аннотированный @WebService) должен расширяться "SpringBeanAutowiringSupport» класс, чтобы пнуть начало весеннего связывания.

Пожалуйста, взгляните также на упомянутые пункты.

Теперь все отлично работает, спасибо. @Autowired все еще не работал, но компонентное сканирование работает, поэтому я поработал с использованием контекста приложения и вызовом getBean ("<ben id> ") метод. Steer360

Похожие вопросы