私の問題は、Bean でサーブレットコンテキストを取得できないことです。カスタム 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) が起動すると、servletContext == null のため、Nullpointerexception が発生します。
では、なぜ servletcontext が注入されないのでしょうか? ContextLoaderListener を web.xml に登録しています
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
いくつかのスコープがあることがわかりました。問題があるかもしれません。applicationsontext スコープについて簡単に説明するか、リンクをお願いします。手伝ってくれてありがとう。私はこの問題に多くの時間を費やしました。
いくつかのデバッグの後、アプリの起動時に servletcontextaware の setServletContexr メソッドが実際に呼び出されたことを理解しましたが、コントローラーから FileRepository でファイルを保存しようとすると、それはすでに null servletContext フィールドを持つ別のオブジェクトでした。
コントローラーのように、必要なときにカスタム Bean でサーブレット コンテキストを autowier する方法はありますか?
最後に、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) {