Проблема с телом запроса Spring с недопустимым xml

#java #string #spring #rest #inputstream

#java #строка #spring #rest #входной поток

Вопрос:

В нашем приложении rest мы используем @RequestBody StreamSorce для загрузки XML-файла. Проблема в том, что сам xml недействителен или содержит несколько недопустимых символов, запрос PUT завершается ошибкой (с ответом http bad request) перед нашей логикой, поэтому мы не можем сообщить клиенту о точной проблеме. Я знаю, что для RequestBody можно использовать просто строку, но имеет ли смысл ее использовать? Я думаю, если я загружу 100Mb xml, каждый запрос создаст тело запроса String с одинаковым размером, и при использовании StreamSource мы читаем входной поток, пока он нам нужен.

Каковы минусы и плюсы использования String или StreamSource в качестве requestbody. Если я сделаю это с помощью StreamSorce, будет ли он сканировать весь xml?

Комментарии:

1. О каких недопустимых символах вы говорите? Если XML неправильно сформирован — произойдет ли сбой?

Ответ №1:

Вы уже знаете недостаток StreamSource: in, из-за которого вы не можете предварительно обработать XML, в случае, если он недействителен.

Использование String: когда XML будет таким большим, это приведет к снижению производительности! Никогда не используйте такие большие объекты в Java — в многопоточной среде сервера приложений это может легко привести к OutOfMemoryError , это делает ваше приложение уязвимым для DoS-атаки!

Лучшее решение — отобразить @RequestBody как InputStream и обработать это InputStream с помощью синтаксического анализатора SAX. У вас низкое потребление памяти (анализатор SAX не сохраняет структуру XML в памяти), и вы можете обрабатывать исключения, которые могут возникать во время обработки.