2015-02-25 4 views
1

Я использую Spring/Jackson для автоматического преобразования json в POJO. Все работает нормально, за исключением случаев, когда я выполняю аутентификацию заголовка (используя фильтр). Я использовал request.getContentLength(), чтобы получить длину строки json.Как перехватить HttpServletRequest с Spring MVC Jackson

Это работало нормально, пока json не содержит диакритический характер. Если длина контента превышает один символ, он должен быть длиннее. Поэтому, очевидно, я должен получить реальное тело json. Это сложно, поскольку вызов request.getInputStream заставляет Jackson выйти из строя, поскольку входной поток уже закрыт. То же самое для getReader.

Итак, я сделал, как описано в этом блоге: http://natch3z.blogspot.co.uk/2009/01/read-request-body-in-filter.html

который работает, но не правильно кодировать UTF-8. Поэтому я заменил эту строку:

bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 

к:

bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); 

который отображает правильный JSON в моем журнале, но я получаю эту ошибку, когда джексон пытается преобразовать в POJO:

nested exception is com.fasterxml.jackson.databind.JsonMappingException: Invalid UTF-8 start byte 0x9f 

Я не уверен, как это сделать, если у кого-нибудь есть идеи?

+0

Нужно ли заранее знать длину строки json в вашем фильтре? Просто интересно, можно ли обойти настоящую проблему ... –

+0

Да, мне нужна длина json. Я разместил решение ниже. Благодарим блог, поскольку он работает с незначительной корректировкой, которую я показал. – wonza

ответ

0

Я просто понял это:

я заменил эту строку:

final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes()); 

с этим:

final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes("UTF-8")); 

я понял раньше, но это может помочь кому-то еще с аналогичный вопрос.