gpt4 book ai didi

java - Spring 3 在自定义 bean 中接收 servletContext

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:22:17 24 4
gpt4 key购买 nike

我的问题是我无法在我的 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没有注入(inject)呢?我在 web.xml 中注册了 ContextLoaderListener

   <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

我发现有一些范围。可能有问题。请简要介绍一下 applicationsontext 范围或提供链接请求。感谢帮助。我花了很多时间来解决这个问题。

经过一些调试后,我了解到 servletcontextaware 的 setServletContextaware 方法实际上是在应用程序启动时调用的,但是当我尝试使用我的 Controller 中的 FileRepository 存储文件时,它已经是另一个具有空 servletContext 字段的对象。

有没有办法在我需要的时候在我的自定义 bean 中自动生成 servlet 上下文,就像在 Controller 中一样?

最后我通过 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) {

最佳答案

ContextLoaderListener 加载成为应用程序全局父上下文的 ApplicationContext。那里没有 ServletContext。 ServletContext 仅存在于(请原谅术语过载)SERVLET 的 CONTEXT 中 - 例如,DispatcherServlet。每个 DispatcherServlet(通常只有一个)注册一个子上下文,该子上下文指向由 ContextLoaderListener 注册的全局父上下文。 ApplicationContexts 就像类加载器。当 IOC 容器“寻找”一个 bean 时,每个 ApplicationContext 都可以“向上”查找其父级以尝试找到它,但它不能向下查找。子级还可以覆盖父级上下文中的 bean 定义。

现在...您的问题似乎是您的 bean 是在找不到 ServletContext 的全局父上下文中定义的。 (它不能“俯视”它的 child 来找到它。)

您需要做的是将 fileStorage 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>

将该 bean 定义向下移动到 contextConfigLocation 指定的位置,一切都应该按预期工作。

关于java - Spring 3 在自定义 bean 中接收 servletContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10666949/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com