Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring3在定制bean中接收servletContext_Java_Spring_Autowired_Inject_Applicationcontext - Fatal编程技术网

Java Spring3在定制bean中接收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

我的问题是无法在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"/>
对此

@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>