2016-02-22 7 views
2

У меня есть и перехватчик и по некоторым причинам я должен читать POSTED даты включены в HttpServletRequest, как это:Не удалось прочитать HTTP сообщение: org.springframework.http.converter.HttpMessageNotReadableException: Требуемое тело запроса отсутствует

InputStream inputStream = request.getInputStream(); 
    if (inputStream != null) { 
     bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
     char[] charBuffer = new char[128]; 
     int bytesRead = -1; 
     while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { 
      stringBuilder.append(charBuffer, 0, bytesRead); 
     } 
    } else { 
     stringBuilder.append(""); 
    } 

после этого действия я получаю 400 плохо запрос AJAX Не удалось прочитать HTTP сообщение: org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing

ответ

4

Spring предлагает класс под названием ContentCachingRequestWrapper, который расширяет HttpServletRequestWrapper. Этот класс кэширует все содержимое, начиная с getInputStream() и getReader() и позволяет получать этот контент через getContentAsByteArray(). Таким образом, мы можем получить InputStream несколько раз для этой цели. Эта способность обеспечивается методом удара в ContentCachingRequestWrapper:

@Override 
    public ServletInputStream getInputStream() throws IOException { 
     if (this.inputStream == null) { 
      this.inputStream = new ContentCachingInputStream(getRequest().getInputStream()); 
     } 
     return this.inputStream; 
    } 

Этот класс исправить проблемы кодировки для UTF-8 с методом ниже:

@Override 
public String getCharacterEncoding() { 
    String enc = super.getCharacterEncoding(); 
    return (enc != null ? enc : WebUtils.DEFAULT_CHARACTER_ENCODING); 
} 

Here полна деталей в ContentCachingRequestWrapper.

2

Я предполагаю, что у вас есть обработчик метод, как следующие:

@RequestMapping(value = "/somewhere", method = POST) 
public SomeResponse someHandler(@RequestBody String body, ...) { ... } 

И вы читаете HttpServletRequestInputStream в своем перехватчике. Поскольку вы можете прочитать InputStream только один раз, когда весна пытается прочитать InputStream, чтобы заполнить параметр метода @RequestBody, он терпит неудачу и жалуется на HttpMessageNotReadableException.

Если вам действительно необходимо прочитать тело запроса несколько раз, вы должны добавить фильтр и украсить HttpServletRequest, чтобы добавить функцию Multiple Read. Для получения дополнительной информации вы можете прочитать это answer.

+0

Его правда. Я изменил его для фильтрации. его штраф, но он изменяет содержимое на не-Юникод. как насчет этого? –

+0

Переопределите метод getCharacterEncoding в вашем фильтре, чтобы вернуть 'UTF-8' в качестве кодировки символов –