#java #jackson #apache-commons-httpclient
#java #джексон #apache-commons-httpclient
Вопрос:
Я использую Apache HttpClient
для инициирования такой задачи:
import org.apache.http.HttpEntity;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.client.methods.HttpGet;
HttpClient client = HttpClientBuilder.create().disableRedirectHandling().build();
HttpGet request = new HttpGet(url);
HttpResponse response = client.execute(request);
HttpEntity entity = response.getEntity();
Этот запрос содержит идентификатор для идентификации задачи, связанной с запросом. Я извлекаю его с помощью Jackson ObjectMapper
.
import com.fasterxml.jackson.databind.ObjectMapper;
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
HttpEntity entity = res.getEntity();
JobStatusModel status = mapper.readValue(entity.getContent(), JobStatusModel.class);
String taskId = status.getId();
Это работает без проблем, я использовал его много раз в своем коде. Я могу извлечь taskId
этот способ без каких-либо проблем и определить, когда задача будет завершена, используя повторные вызовы другого REST API для статуса задачи.
Ошибка возникает, когда я пытаюсь извлечь результаты завершенной задачи. Это делается с помощью аналогичного запроса на другой URL:
HttpGet request = new HttpGet(url);
HttpResponse response2 = client.execute(request);
HttpEntity entity2 = response2.getEntity();
JobResultModel status = mapper.readValue(entity2.getContent(), JobResultModel.class);
request.releaseConnection();
Эта последняя строка завершается ошибкой с очень бесполезным исключением:
java.net.SocketException: socket closed
Я перепробовал много способов прочитать объект ответа, чтобы понять, что не так. Я попробовал использовать точно такой же вызов Postman
, и он прошел успешно без проблем. Ошибка не имеет ничего общего с неправильной формой JobResultModel
. С конфигурацией DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
для ObjectMapper
, он должен даже допускать ошибки в любом случае.
Заранее большое спасибо за любую помощь!
Комментарии:
1. Действительно ли он терпит неудачу
request.releaseConnection
? Вы освобождаете соединение в описанном выше успешном сценарии?2. Сбой в строке
JobResultModel status = mapper.readValue(entity2.getContent(), JobResultModel.class)
3. Обычно рекомендуется публиковать полную трассировку стека. Я предполагаю, что Mapper пытается считывать данные из Inputstream, поддерживаемого socked, и этот сокет в конечном итоге закрывается. Может быть, обернуть
entity2.getContent()
в какой-нибудь отладочный поток фильтров, чтобы просмотреть содержимое и байты, которые были фактически обработаны до сбоя.