Jax-ws,spring和SpringBeanAutowiringSupport

Eug*_*neP 3 java spring cxf jax-ws autowired

虽然在我的@Webservice类中我扩展了SpringBeanAutowiringSupport,但自动装配对于Spring 2.5,tomcat6来说并不起作用.

什么都没注入.

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

你有想法吗?

小智 9

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

解决方案:

使用org.springframework.beans.factory.config.AutowireCapableBeanFactory.class而不是使用@Autowired注释来注入bean(例如@Service,@Repository等).

所以:

  1. 包括 @Resource WebServiceContext

    @Resource
    private WebServiceContext context;  
    
    Run Code Online (Sandbox Code Playgroud)
  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");
    
    Run Code Online (Sandbox Code Playgroud)

    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);
        }
    
        //...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在此之后,您可以myDAO@WebMethod方法中使用对象.