Jax-ws,spring和SpringBeanAutowiringSupport

时间:2010-05-31 11:05:12

标签: java spring jax-ws cxf autowired

虽然在我的@Webservice类中 我扩展了SpringBeanAutowiringSupport,自动装配根本不适用于Spring 2.5, 的tomcat6。

没有注入任何东西。

我在main方法中测试了那些bean自动装配,使用classpathcontext,一切都注入正常。 但不适用于jax-ws端点。

你有想法吗?

4 个答案:

答案 0 :(得分:9)

我找到了解决方案。问题是Spring没有为@WebService类自动装配bean(在其他论坛上可能是当前的bug)。

解决方案

使用org.springframework.beans.factory.config.AutowireCapableBeanFactory.class而非使用@Autowired注释来注入您的bean(例如@Service@Repository等)。

所以:

  1. 包括@Resource WebServiceContext

    @Resource
    private WebServiceContext context;  
    
  2. 用它来获取你的bean

    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对象。

答案 1 :(得分:4)

我不知道是否和其他人一样。它通过改变web.xml中侦听器的顺序为我工作。在WSServletContextListener之前放置ContextLoaderListener解决了这个问题。

答案 2 :(得分:1)

我猜你正在使用这个配置元素:

<context:annotation-config />

但要启用对@Endpoint注释的支持,必须添加以下元素:

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

答案 3 :(得分:0)

如果您使用一些参考实现(如Metro,Axis2,apache-cxf)以便在Web服务上轻松配置此类端点,那会更好。