Избегайте ошибок «невозможно повторить из-за проверки подлинности сервера в потоковом режиме», без участия CXF - PullRequest
6 голосов
/ 15 декабря 2010

Я искал в нескольких местах других людей, которые имели дело с этой проблемой HttpRetryException, но все, что я обнаружил, столкнулись с какой-то службой apache под названием CXF, которую я не использую. Я использую java.net.HttpURLConnection. Я создаю соединение, использую setRequestProperty для «Авторизации», получаю выходной поток, записываю группу байтов и затем пытаюсь прочитать входной поток ответа. В большинстве случаев это работает, но иногда я получаю исключение, упомянутое выше. Я не могу избежать потоковой передачи, потому что иногда мне нужно писать файлы большего размера, чем они могут быть сохранены в памяти, и, во всяком случае, большинство результатов поиска, обнаруженных мной, показывают, что это не является реальной проблемой. Они обычно дают решения в соответствии с bindingProvider.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "username"); bindingProvider.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "password"); Я не использую cxf или любую другую оболочку через HttpURLConnection, и у меня нет службы или поставщика привязки для ссылки. И имя пользователя и пароль, установленные с помощью setRequestProperty, прекрасно работают для аутентификации в большинстве случаев. Хотел бы я сказать, какие конкретные предварительные условия необходимы для надежной репликации ошибки, но пока она была обнаружена или пропущена.

1 Ответ

10 голосов
/ 28 декабря 2010

В JDK есть только одно место, где выбрасывается java.net.HttpRetryException, и это в случае, когда используется HttpURLConnection, и он пытается следовать перенаправлению (см. Sun.net.www.protocol.http.HttpURLConnection .followRedirect ())

Таким образом, по сути, сервер ответил кодом состояния HTTP 3xx (кроме 304 и 306) и теперь пытается следовать местоположению, указанному в заголовке HTTP Location:. Но поскольку потоковая передача включена, она не может следовать за перенаправлением.

Попробуйте установить java.net.HttpURLConnection.setInstanceFollowRedirects(false)

Хотя я бы предпочел проверить, почему сервер отправляет HTTP-перенаправление в первую очередь. Из вашего описания я понимаю, что вы выполняете большую загрузку с использованием HTTP POST, это правильно?

...