0

私はSpringブートアプリケーションでCommonsMultipartResolverを使用しようとしています。私はStandardServletMultipartResolverを使用することはできません。例外(ファイルサイズを超えるなど)を処理したいからです。SpringブートでCommonsMultipartResolverを設定できません1.2.8

私はcommons-fileuploadに依存関係を設定しました。私の春の構成は次のとおりです。

@Autowired 
    private MultipartProperties multipartProperties = new MultipartProperties(); 

    @Bean 
    public MultipartConfigElement multipartConfigElement() { 
     return this.multipartProperties.createMultipartConfig(); 
    } 

    @Bean 
    public MultipartResolver multipartResolver() { 
     LOG.debug("initializing MultipartResolver"); 
     CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); 
     return multipartResolver; 
    } 

    @Bean 
    public FilterRegistrationBean multipartFilterRegistrationBean() { 
     final MultipartFilter multipartFilter = new MultipartFilter(); 
     final FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(multipartFilter); 
     multipartFilter.setMultipartResolverBeanName("multipartResolver"); 
     filterRegistrationBean.setOrder(OrderedHiddenHttpMethodFilter.DEFAULT_ORDER-1); 
     return filterRegistrationBean; 
    } 

私は前HiddenHttpMethodFilterに実行されるようにMultipartFilterを設定するとき、私はIOExceptionを得る:

Caused by: java.io.IOException: Missing content for multipart request 
at org.eclipse.jetty.util.MultiPartInputStreamParser.parse(MultiPartInputStreamParser.java:491) 
at org.eclipse.jetty.util.MultiPartInputStreamParser.getParts(MultiPartInputStreamParser.java:400) 
at org.eclipse.jetty.server.Request.getParts(Request.java:2139) 
at org.eclipse.jetty.server.Request.extractMultipartParameters(Request.java:385) 
... 35 common frames omitted 

そうでなければ、私は、一部のパラメータが存在しないという例外を取得します要求に含まれます。

私は、サーブレット3.0のマルチパートリクエストの処理を無効にする必要があると考えていますが、春の起動時にどのように行うのか分かりません。

+0

スタックトレースで判断すると、どこにも言及していないJettyを使用しているようです。他の矛盾を避けるために、問題を再現する最小の例を提供できますか? –

答えて

0

問題は、HiddenHttpMethodFilterで呼ばれていたgetParameter上の例外をスローDefaultMultipartHttpServletRequestによって引き起こされた:これまで私のソリューションを無効にすることだった

@Override 
protected void doFilterInternal(HttpServletRequest request, >HttpServletResponse response, FilterChain filterChain) 
     throws ServletException, IOException { 

    String paramValue = request.getParameter(this.methodParam); 
    if ("POST".equals(request.getMethod()) && >StringUtils.hasLength(paramValue)) { 
     String method = paramValue.toUpperCase(Locale.ENGLISH); 
     HttpServletRequest wrapper = new >HttpMethodRequestWrapper(request, method); 
     filterChain.doFilter(wrapper, response); 
    } 
    else { 
     filterChain.doFilter(request, response); 
    } 
} 
MultipartAutoConfiguration、 beanを定義しないでください。サーブレット3.0のマルチパート解析を無効にし、 MultipartFilerは使用しません。

今の構成は次のようになります。

@Autowired 
private MultipartProperties multipartProperties = new MultipartProperties(); 

@Bean 
public MultipartResolver multipartResolver() { 
    LOG.debug("initializing MultipartResolver"); 
    MultipartConfigElement config = multipartProperties.createMultipartConfig(); 
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); 
    multipartResolver.setResolveLazily(true); 
    multipartResolver.setMaxUploadSize(config.getMaxRequestSize()); 
    multipartResolver.setMaxUploadSizePerFile(config.getMaxFileSize()); 
    return multipartResolver; 
} 

今ではファイルが最大サイズを超えた場合、正しいHTTPコードを返すように@ExceptionHandlerアドバイスを使用することも可能です。

-1

春のブート自動MultipartConfigElementを設定し、HiddenHttpMethodFilterは春のドキュメントに記載されているように、マルチパートの処理後に実行する必要があることを、

は注意してちょうどあなたのクラスパスからコモンズ、ファイルアップロードを削除https://spring.io/guides/gs/uploading-files/を参照してください。

注:このフィルタは、マルチパートPOSTリクエストの場合は、POSTボディパラメータをチェックする必要があるため、マルチパート処理後に実行する必要があります。したがって、通常、web.xmlフィルタチェーン内にこのHiddenHttpMethodFilterの前にSpring MultipartFilterを配置します。ストリームがすでにMultipartFilterで処理されたため、

+0

私は自動設定を無効にして、明示的に 'StandardServletMultipartResolver'を使いたくないと述べました。 – kpentchev

関連する問題