我有一个春季启动应用程序,为我的基于运动衫的API提供服务。我要求服务层将blob数据作为流提供给客户端。我写了一个servlet来做到这一点,并按如下方式配置它。
@Bean
public ServletRegistrationBean servletRegistrationBean(){
return new ServletRegistrationBean(new BlobReaderServlet(),"/blobReader/*");
}
但是,在servlet代码中,我似乎无法注入任何组件(它们都是null)。我需要注入一个实际从数据库加载blob数据的组件。
@WebServlet(name = "BlobReaderServlet",
urlPatterns = {"/blobreader"})
@Component
public class BlobReaderServlet extends HttpServlet {
Logger logger = Logger.getLogger(this.getClass().getName());
@Inject
DocumentLoaderComponent blobLoader;
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
我强烈怀疑servlet毕竟不是一个弹簧管理组件,并且依赖注入不起作用。如何从上下文访问组件?
更新
这比我想象的要简单得多。
@Override
public void init() throws ServletException {
ApplicationContext ac = (ApplicationContext) getServletConfig().getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
this.documentBlob = (DocumentBlob) ac.getBean("documentBlobBean");
}
答案 0 :(得分:1)
您的servlet不是Spring托管bean,这是正确的。那是因为您直接实例化实例(即在bean方法中调用new BlobReaderServlet()
)。另一种解决方案是按如下方式更改配置类:
@Bean
public ServletRegistrationBean servletRegistrationBean(){
return new ServletRegistrationBean(blobReaderServlet(),"/blobReader/*");
}
@Bean
public BlobReaderServlet blobReaderServlet(){
return new BlobReaderServlet();
}
这将允许Spring管理实例并对其执行自动装配。