Jax-ws, spring и SpringBeanAutowiringSupport - PullRequest
3 голосов
/ 31 мая 2010

хотя в моем классе @Webservice Я расширяю SpringBeanAutowiringSupport, автопроводка просто не работает для Spring 2.5, tomcat6.

ничего не вводится.

Я протестировал автоматическое подключение этих компонентов в основном методе, используя classpathcontext, все вводится нормально. Но не для конечной точки jax-ws.

У вас есть идеи?

Ответы [ 4 ]

9 голосов
/ 24 ноября 2010

Я нашел решение. Проблема в том, что Spring не поддерживает автоматическую передачу bean-компонентов для классов @WebService (как можно найти на других форумах, это может быть текущая ошибка).

Решение :

Используйте org.springframework.beans.factory.config.AutowireCapableBeanFactory.class вместо @Autowired аннотации для инъекции ваших бобов (например, @Service, @Repository и т. Д.).

Итак:

  1. включает @Resource WebServiceContext

    @Resource
    private WebServiceContext context;  
    
  2. используйте его для получения вашего боба

    MyDAO myDAO = null;
    ServletContext servletContext = (ServletContext) context
        .getMessageContext().get("javax.xml.ws.servlet.context");
    WebApplicationContext webApplicationContext = WebApplicationContextUtils
        .getRequiredWebApplicationContext(servletContext);
    myDAO = (MyDAO) webApplicationContext
        .getAutowireCapableBeanFactory().getBean("myDAO");
    

    MyDAO класс может быть следующим:

    @Service
    @Qualifier("myDAO")    
    @Transactional
    public class MyDAO {
        private HibernateTemplate hibernateTemplate;
    
        @Required
        @Autowired
        public void setSessionFactory(SessionFactory sessionFactory) {
            this.hibernateTemplate = new HibernateTemplate(sessionFactory);
        }
    
        public MyInfo getMyInfo(Long id){
            return this.hibernateTemplate.get(MyInfo.class, id);
        }
    
        //...
    }
    
  3. после этого вы можете использовать myDAO объект в методе @WebMethod.

4 голосов
/ 01 августа 2012

Я не знаю, тот ли это случай, что и у всех остальных. Это сработало для меня, изменив порядок слушателей в web.xml. Размещение ContextLoaderListener до того, как WSServletContextListener решит проблему.

1 голос
/ 31 мая 2010

Я предполагаю, что вы используете этот элемент конфигурации:

<context:annotation-config />

Но чтобы включить поддержку аннотации @Endpoint, необходимо добавить этот элемент:

<context:component-scan base-package="" />
0 голосов
/ 11 февраля 2014

Было бы лучше, если бы вы использовали некоторые эталонные реализации, такие как Metro, Axis2, apache-cxf, для простой настройки такой конечной точки в веб-сервисе.

...