Сбой объектной карты Джексона: сокет закрыт

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