Я использую 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
Я не уверен, как это сделать, если у кого-нибудь есть идеи?
Нужно ли заранее знать длину строки json в вашем фильтре? Просто интересно, можно ли обойти настоящую проблему ... –
Да, мне нужна длина json. Я разместил решение ниже. Благодарим блог, поскольку он работает с незначительной корректировкой, которую я показал. – wonza