私のコントローラーはすべて、次の抽象クラスを拡張します。
public abstract class AbstractController {
public HttpServletRequest request;
public HttpServletResponse response;
public ModelMap model;
}
さらに、次のインターセプターを実装しました。
public class HttpRequestInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException {
if (handler instanceof AbstractController) {
AbstractController controller = (AbstractController) handler;
controller.request = request;
controller.response = response;
controller.model = new ModelMap();
}
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
if (handler instanceof AbstractController && modelAndView != null) {
AbstractController controller = (AbstractController) handler;
modelAndView.addAllObjects(controller.model);
}
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
request
これは、コードの因数分解を改善するために見つけた解決策です。コントローラー内で、 、response
およびmodel
as メソッド パラメーターを渡す必要がないためです。この問題が見つかるまで、ソリューションは正常に機能します。
public class HomeController extends AbstractController {
@RequestMapping
public void download1() {
// use the parent attribute response
File file = new File(MY_FILE_PATH);
InputStream in = new BufferedInputStream(new FileInputStream(file));
ServletOutputStream out = response.getOutputStream();
IOUtils.copy(in, out);
response.flushBuffer();
}
@RequestMapping
public void download2(HttpServletResponse response) {
// use the response passed as parameter
File file = new File(MY_FILE_PATH);
InputStream in = new BufferedInputStream(new FileInputStream(file));
ServletOutputStream out = response.getOutputStream();
IOUtils.copy(in, out);
response.flushBuffer();
}
}
上記の 2 つの方法はどちらもブラウザにファイルをダウンロードさせますが、download1
一方は空のファイルをdownload2
生成し、一方は本来のファイルを生成します。理由はありますか?
デバッガーのおかげpostHandle
で、インターセプターのメソッドで、メソッドが等しいをdownload2
生成するのに対し、メソッドはインスタンス化されたものを生成することに気付きました。これは問題にとって何かを意味するはずですが、何を見つけることができません。modelAndView
null
download1
response
コントローラーのメソッドのパラメーターとして渡されたときに、どのようにインスタンス化されますか?