Java Web 服务中的 Spring Autowired 无法正常工作
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/21193843/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Spring Autowired in Web Service not working
提问by user3207820
I must be missing something simple, but I'm having trouble getting an Autowired property to be assigned to a bean. All similar answers posted here seem to revolve around one of three solutions:
我一定遗漏了一些简单的东西,但是我无法将 Autowired 属性分配给 bean。此处发布的所有类似答案似乎都围绕以下三种解决方案之一:
- extend SpringBeanAutowiringSupport
- use <context:component-scan base-package="..." /> in applicationContext.xml
- use <context:annotation-config /> in applicationContext.xml
- 扩展 SpringBeanAutowiringSupport
- 在 applicationContext.xml 中使用 <context:component-scan base-package="..." />
- 在 applicationContext.xml 中使用 <context:annotation-config />
I tried to make a minimalist bean to represent my DAO and inject it into a Web Service.
我尝试制作一个极简的 bean 来表示我的 DAO 并将其注入到 Web 服务中。
DAO interface:
DAO接口:
package wb;
public interface FooDAO {
public String doNothing();
}
DAO implementation:
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 Service with injection:
带注入的 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();
}
}
applicationContext.xml content within the beans tags:
bean 标签中的 applicationContext.xml 内容:
<context:annotation-config />
<context:component-scan base-package="ws"/>
<bean id="fooDAO" class="wb.FooDAOImpl" />
This was all created in the latest NetBeans, in a project created with Spring and Hibernate frameworks. When I deploy to JBoss, and the app starts up, I get the expected Bean instantiation:
这都是在最新的 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
Once I call the web service, the log also reports:
一旦我调用 Web 服务,日志也会报告:
11:03:07,097 INFO [stdout] (http--127.0.0.1-8080-1) WS: doNothing() says DAO = null
What am I missing?
我错过了什么?
采纳答案by Kevin Bowersox
SpringBeanAutowiringSupport
must be a bean. You need to annotate that class with @Service
or another annotation such as @Component
that indicates a class should be a bean when component scanning occurs. These will be picked up by Spring
and made into beans.
SpringBeanAutowiringSupport
必须是豆子。您需要使用@Service
或其他注释对该类进行注释,例如在@Component
发生组件扫描时指示类应该是 bean。这些将被捡起Spring
并制成豆子。
Remember that in order to be a participant in autowiring, such as having another bean injected, the class must be a bean itself and managed by Spring's IOC container.
请记住,为了成为自动装配的参与者,例如注入另一个 bean,该类必须是一个 bean 本身并由 Spring 的 IOC 容器管理。
回答by Alireza Fattahi
The spring
should start before webservices
.
该spring
前应启动webservices
。
The the webservices-rt*.jar
is a plugable jar which starts automaticly to find the end points.
本该webservices-rt*.jar
是一个可插拔的罐子它开始全自动找到终点。
In some cases it may happen that the webservices starts before spring. So the injects
can not be done. Make sure that the start up has correct order.
在某些情况下,webservice 可能会在 spring 之前启动。所以injects
是做不到的。确保启动顺序正确。