#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 в памяти), и вы можете обрабатывать исключения, которые могут возникать во время обработки.