Web服务中的Spring自动连接无法正常工作

时间:2014-01-17 19:05:19

标签: java spring java-ee autowired

我必须遗漏一些简单的东西,但是我无法将Autowired属性分配给bean。这里发布的所有类似答案似乎都围绕着三种解决方案之一:

  1. 扩展SpringBeanAutowiringSupport
  2. 使用< context:component-scan base-package =“...”/>在applicationContext.xml
  3. 使用< context:annotation-config />在applicationContext.xml
  4. 我尝试制作一个简约bean来代表我的DAO并将其注入Web服务。

    DAO界面:

    package wb;
    public interface FooDAO {
        public String doNothing();
    }
    

    DAO实施:

    package wb;
    import org.springframework.stereotype.Component;
    
    @Component
    public class FooDAOImpl implements FooDAO {
        public FooDAOImpl() {
            System.out.println("FooDAOImpl: Instantiated " + this);
        }
    
        @Override
        public String doNothing() {
            System.out.println("FooDAOImpl: doNothing() called");
            return "Did nothing!";
        }
    }
    

    带注入的Web服务:

    package ws;
    
    import javax.jws.WebService;
    import javax.jws.WebMethod;
    import javax.jws.WebResult;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.context.support.SpringBeanAutowiringSupport;
    import wb.FooDAO;
    
    @WebService(serviceName = "WS")
    public class WS extends SpringBeanAutowiringSupport {
    
        @Autowired(required = true)
        private FooDAO fooDAO;
    
        @WebMethod(exclude = true)
        public void setFooDAO(FooDAO fooDAO) {
            this.fooDAO = fooDAO;
            System.out.println("WS: fooDAO set = " + fooDAO);
        }
    
        public WS() {
            System.out.println("WS: WS bean instantiated!");
        }
    
        @WebMethod(operationName = "doNothing")
        @WebResult(name = "whatDidIDo")
        public String doNothing() {
            System.out.println("WS: doNothing() says DAO = " + fooDAO);
            return fooDAO == null ? "Could not do nothing!" : fooDAO.doNothing();
        }
    }
    

    beans标签中的applicationContext.xml内容:

    <context:annotation-config />
    <context:component-scan base-package="ws"/>
    
    <bean id="fooDAO" class="wb.FooDAOImpl" />
    

    这是在使用Spring和Hibernate框架创建的项目中的最新NetBeans中创建的。当我部署到JBoss并且应用程序启动时,我得到了预期的Bean实例化:

    11:01:46,767 INFO  [stdout] (MSC service thread 1-6) WS: WS bean instantiated!
    11:01:47,571 INFO  [stdout] (MSC service thread 1-15) FooDAOImpl: Instantiated wb.FooDAOImpl@11176682
    

    一旦我调用了Web服务,日志也会报告:

    11:03:07,097 INFO  [stdout] (http--127.0.0.1-8080-1) WS: doNothing() says DAO = null
    

    我错过了什么?

2 个答案:

答案 0 :(得分:6)

SpringBeanAutowiringSupport必须是一个bean。您需要使用@Service或其他注释(例如@Component)注释该类,以指示在发生组件扫描时类应该是bean。这些将被Spring选中并制作成豆。

请记住,为了成为自动装配的参与者,例如注入另一个bean,该类必须是bean本身并由Spring的IOC容器管理。

答案 1 :(得分:0)

spring应该在webservices之前开始。

webservices-rt*.jar是一个可插入的jar,它会自动开始以查找端点。

在某些情况下,可能会在春季之前启动Web服务。因此injects无法完成。确保启动顺序正确。