2010-05-31 3 views
3

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

ничего не вводили.

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

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

ответ

1

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

<context:annotation-config /> 

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

<context:component-scan base-package="" /> 
+0

Я говорил о «jaxws: endpoint» xml element. Я использую проверку компонентов, как вы упомянули, но с непустым базовым пакетом, то есть base-package = "pack1, pack2". Все еще не работает :) – EugeneP

+0

У меня такая же проблема. У меня есть ссылка на конфигурацию в этом ответе. Я использую GlassFish 3.1 и Spring 3.0.5.RELEASE. Любые другие предложения? – AR3Y35

9

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

Решение:

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

Итак:

  1. включает @ResourceWebServiceContext

    @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

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

0

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