我的问题是我无法在我的 bean 中获取 servletcontext。我创建了自定义 bean“FileRepository”,我需要在那里获取 ServletContext。这是代码
package com.pc.webstore.utils;
import java.io.File;
import java.nio.file.Files;
import javax.servlet.ServletContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.ServletContextAware;
public class FileRepository implements ServletContextAware {
private ServletContext servletContext;
public String saveFile(File file){
File tempdir = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
...
}
@Override
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
}
在 ApplicationContext.xml 中注册
<bean id="fileStorage" class="com.pc.webstore.utils.FileRepository"/>
当 saveFile(File file) 启动时,我收到 Nullpointerexception 因为 servletContext == null。
那么为什么 servletcontext 不注入呢? 我在 web.xml 中注册了 ContextLoaderListener
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
我发现有一些范围。可能有问题。简要告诉我有关 applicationsontext 范围的信息或提供链接请求。感谢帮助。我花了很多时间来解决这个问题。
经过一些调试后,我了解到实际上在应用程序启动时调用了 servletcontextaware 的 setServletContexr 方法,但是当我尝试从我的控制器中使用 FileRepository 存储文件时,它已经是另一个带有 null servletContext 字段的对象。
有没有办法在我想要的时候在我的自定义 bean 中自动处理 servlet 上下文,比如在控制器中?
最后我通过 ServletContextAware 获得了 servletContext。我改变了创建fileRepository bean的方式。由此
public String create(@Valid Item item, BindingResult bindingResult, Model uiModel, HttpServletRequest httpServletRequest, FileRepository fileRepository) {
对此
@Autowired
private FileRepository fileRepository;
@RequestMapping(method = RequestMethod.POST, produces = "text/html")
public String create(@Valid Item item, BindingResult bindingResult, Model uiModel, HttpServletRequest httpServletRequest) {