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

use*_*820 3 java spring autowired java-ee

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

  1. 扩展SpringBeanAutowiringSupport
  2. 在applicationContext.xml中使用<context:component-scan base-package ="..."/>
  3. 在applicationContext.xml中使用<context:annotation-config />

我尝试制作一个简约bean来代表我的DAO并将其注入Web服务.

DAO界面:

package wb;
public interface FooDAO {
    public String doNothing();
}
Run Code Online (Sandbox Code Playgroud)

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!";
    }
}
Run Code Online (Sandbox Code Playgroud)

注入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();
    }
}
Run Code Online (Sandbox Code Playgroud)

beans标签中的applicationContext.xml内容:

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

<bean id="fooDAO" class="wb.FooDAOImpl" />
Run Code Online (Sandbox Code Playgroud)

这些都是在最新的NetBeans中创建的,在使用Spring和Hibernate框架创建的项目中.当我部署到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
Run Code Online (Sandbox Code Playgroud)

我调用Web服务后,日志还会报告:

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

我错过了什么?

Kev*_*sox 8

SpringBeanAutowiringSupport必须是一个豆.您需要使用@Service或其他注释来注释该类,例如@Component,表示在发生组件扫描时类应该是bean.这些将由Spring豆子挑选并制成豆子.

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

  • 在App启动期间创建的WS实例获得自动连接的DAOImpl.但是在调用Web服务时,会创建一个不同的WS实例来对请求进行字段设置,而实例却没有获得一个.奇怪的.无论如何,再次感谢. (4认同)