0

Я пытаюсь использовать CommonsMultipartResolver в приложении Spring Boot. Я не могу использовать StandardServletMultipartResolver, поскольку я хочу обрабатывать исключения (например, превышение размера файла).Не удается настроить CommonsMultipartResolver с Spring Boot 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; 
    } 

Когда я создал MultipartFilter быть выполнена до проведения HiddenHttpMethodFilter я получаю 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

Проблема была вызвана DefaultMultipartHttpServletRequest бросать исключение на getParameter, который был назван HiddenHttpMethodFilter, поскольку поток уже был обработан в MultipartFilter:

@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-компонент MultipartConfigElement, чтобы отключить сервлет 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; 
} 

Теперь можно даже использовать @ExceptionHandler совет, чтобы вернуть правильный код HTTP, если файл превышает максимально допустимый размер.

-1

Spring загрузки автоматически настраивает MultipartConfigElement см https://spring.io/guides/gs/uploading-files/ Просто удалите Викисклада FileUpload с вашего пути к классам

Имейте в виду, что HiddenHttpMethodFilter должна быть выполнена после многочастного обработки, как указано в пружинных документы:

ПРИМЕЧАНИЕ. Этот фильтр должен запускаться после многопроцессорной обработки в случае многостраничного запроса POST из-за присущей ему необходимости проверки параметра тела POST. Поэтому обычно добавляйте Spring MultipartFilter перед этим HiddenHttpMethodFilter в цепочку фильтров web.xml.

+0

Я отключил автоконфигурацию и прямо заявил, что я не хочу использовать 'StandardServletMultipartResolver'. – kpentchev