Java Spring3在定制bean中接收servletContext
我的问题是无法在bean中获取servletcontext。 我创建了自定义bean“FileRepository”,需要在那里获取ServletContext。 这是密码Java Spring3在定制bean中接收servletContext,java,spring,autowired,inject,applicationcontext,Java,Spring,Autowired,Inject,Applicationcontext,我的问题是无法在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.ann
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"/>
对此
@Autowired
private FileRepository fileRepository;
@RequestMapping(method = RequestMethod.POST, produces = "text/html")
public String create(@Valid Item item, BindingResult bindingResult, Model uiModel, HttpServletRequest httpServletRequest) {
ContextLoaderListener加载成为应用程序全局父上下文的ApplicationContext。这里没有ServletContext。ServletContext只存在于SERVLET的上下文中(请原谅术语重载),例如DispatcherServlet。每个DispatcherServlet(通常只有一个)注册一个子上下文,该子上下文指向ContextLoaderListener注册的全局父上下文。ApplicationContexts类似于类加载器。当IOC容器“查找”一个bean时,每个ApplicationContext都可以“向上”查找其父级以试图找到它,但不能向下查找。子项还可以从父上下文重写bean定义 现在。。。您的问题似乎是bean是在全局父上下文中定义的,在全局父上下文中找不到ServletContext。(它不能“低头”看着它的孩子去寻找它。) 您需要做的是将文件存储bean定义“向下”移动到DispatcherServlet的ApplicationContext中 在web.xml中定义DispatcherServlet时,通常会指定在何处可以找到定义其子上下文的文件。像这样:
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/web-context/*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
调度员服务
org.springframework.web.servlet.DispatcherServlet
上下文配置位置
类路径:/web上下文/*.xml
1.
将该bean定义向下移动到contextConfigLocation指定的位置,所有操作都应按预期进行。我已将bean注册的位置更改为WEB-INF/spring/webmvc-config.xml,但我仅在应用程序启动时接收servletContext。当我调用fileRepository.saveFile()时,fileRepository是另一个没有定义servletContext的实例。当我使用它时,有没有一种方法可以将servletContext自动连接到我的bean。就像控制器一样@自连线专用ServletContext ServletContext;谢谢。可能是我在控制器中获得类似fileRepository的方法参数的问题。您是否声称您现在有两个fileRepository实例?如果是这样,请在我对ApplicationContext层次结构的评论中回顾您正在做的事情。如果另一个未由子上下文定义的bean被注入了一个也未在子上下文中定义的FileRepository,那么该FileRepository仍将显示您原来的问题。您需要确保依赖于ServletContext(或者依赖于依赖于它的东西,等等)的所有内容都是在子上下文中定义的,而不是在父上下文中定义的。
@Autowired
private FileRepository fileRepository;
@RequestMapping(method = RequestMethod.POST, produces = "text/html")
public String create(@Valid Item item, BindingResult bindingResult, Model uiModel, HttpServletRequest httpServletRequest) {
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/web-context/*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>