Почему json ObjectMapper выбрасывает java.io.EOFException: нет содержимого для сопоставления с объектом из-за конца ввода

У меня есть ответ от веб-службы REST, который выглядит следующим образом:

{
   "number":447919191231,
   "messages":"",
   "receipt":{
      "uid":"5d1bddf5-1b98-4a32-8ebf-f71c3973e7a8",
      "messages":"",
      "status":"SUCCESS",
      "code":"09641",
      "ttl":120,
      "url":"http:\/\/server:8080\/x\/d6985"
   }
}

и я пытаюсь использовать метод, описанный здесь в полном примере привязки данных

http://wiki.fasterxml.com/JacksonInFiveMinutes

Я создал класс, который выглядит так:

public class ReceiptResponse {

    private int _number;
    private String _messages;
    private Receipt _receipt;

    public int getNumber() { return _number; }
    public void setNumber(int number) { this._number = number; }
    public String getMessages() { return _messages; }
    public void setMessages(String messages) { this._messages = messages; }
    public Receipt getReceipt() { return _receipt; }
    public void setReceipt(Receipt receipt) { this._receipt = receipt; }

public static class Receipt {
        private String _uid;
        private String _messages;
        private String _status;
        private int _code;
        private int _ttl;
        private String _url;

        public String getUid() { return _uid; }
        public void setUid(String uid) { this._uid = uid; }
        public String getMessages() { return _messages; }
        public void setMessages(String messages) { this._messages = messages; }
        public String getStatus() { return _status; }
        public void setStatus(String status) { this._status = status;}
        public int getCode() { return _code; }
        public void setCode(int code) { this._code = code; }
        public int getTtl() { return _ttl; }
        public void setTtl(int ttl) { this._ttl = ttl; }
        public String getUrl() { return _url; }
        public void setUrl(String url) { this._url = url; }
    }
}

Мой код для анализа этого ответа выглядит следующим образом:

ObjectMapper mapper = new ObjectMapper(); 
ReceiptResponse response = mapper.readValue(method.getResponseBodyAsStream(), ReceiptResponse.class);

Но он выдает следующую ошибку:

12:03:44,195 ERROR [STDERR] Fatal transport error: No content to map to Object due to end of input
12:03:44,195 ERROR [STDERR] java.io.EOFException: No content to map to Object due to end of input
12:03:44,196 ERROR [STDERR]     at org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:1630)
12:03:44,196 ERROR [STDERR]     at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:1580)
12:03:44,196 ERROR [STDERR]     at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1158)

Может ли кто-нибудь помочь мне, объяснив, почему это происходит? Я подумал, что, возможно, это потому, что сообщения пусты, но я попытался поместить туда фиктивные данные, но это все равно не удалось. Я искал код ObjectMapper, и кажется, что он не может найти первый токен (я прав?), Но я не понимаю, почему он не сможет его найти?

любая помощь будет оценена!

13 ответов

Я столкнулся с этой проблемой также. Весной MVC HandlerInterceptorAdaptor это было предназначено для регистрации всех входящих HTTP-запросов, у меня был этот код:

LOG.trace("[REQUEST / Body]: \n" + IOUtils.toString(request.getInputStream()));
LOG.trace("[REQUEST / Content-Type]: " + request.getContentType());

К сожалению, используя getInputStream()Прочитал бы до конца InputStream, Закомментирование первой строки исправило это. К тому времени, когда HTTP-запрос достиг моего контроллера, он достиг конца ввода, как указано в исключении. Имеет смысл, моя ошибка!

Даже я столкнулся с той же проблемой в моем проекте Spring MVC для вызова REST. Ошибка в моем коде заключалась в том, что я использовал @RequestBody в методе контроллера для вызова GET. Я сопоставил метод для запроса POST, и проблема решена.

В моем случае я дважды использовал @RequestBody для одного и того же метода-обработчика, как здесь:

public String handle(@RequestBody String body,
                     @RequestBody @Valid RequestParams obj) {...}

Итак, я удалил один из них, и это помогло.

Я просто столкнулся с той же проблемой. У меня был чрезмерно длинный поток от ответа. Преобразование его в строку помогло обойти первоначальное исключение. Однако это не решило все проблемы, поэтому я добавил конструкторов 0-arg ко всем pojos, участвующим в отображении. Картограф работал отлично после этого.

Я также столкнулся с проблемой, но причина просто empty string,

В случае, если мы предоставляем пустую строку, мы получаем: java.io.EOFException: No content to map to Object due to end of input

Чтобы решить эту проблему, пожалуйста, проверьте данные JSON перед обработкой.

Эта ошибка также возникает, если вы вызываете doFilter более одного раза в фильтре.

например

public class MyFilter implements Filter {

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException {
    /* do something */
        //first call succeeds
        filterChain.doFilter(servletRequest, servletResponse);
    /* do some other things */
        //second call results in java.io.EOFException: No content to map to Object due to end of input
        filterChain.doFilter(servletRequest, servletResponse);
}

@Override
public void init(FilterConfig cfg) throws ServletException {
}

@Override
public void destroy() {}
}

Я только что получил ту же ошибку. После отслеживания моя проблема была вызвана неправильным параметром, переданным в функциях javascript, из-за которого неопределенные данные были отправлены в службу REST.

В журналах, как показано ниже, строка "Content-Length: 0" указывает на основную причину.

642 > PUT http://localhost:8080/********
642 > Host: localhost:8080
642 > Connection: keep-alive
642 > Content-Length: 0
642 > Accept: */*
642 > Origin: http://localhost:8080
642 > X-Requested-With: XMLHttpRequest

Я тоже столкнулся с этой проблемой при тестировании службы REST. я использовал @PathParam атрибут, который ссылается с неправильной банки. Пожалуйста, проверьте ваши заявления на импорт, чтобы увидеть, если PathParam читается из javax.ws.rs.PathParam или нет

Я также столкнулся с той же проблемой, здесь файл "services.json" не существует во время выполнения, поэтому ObjectMapper генерирует java.io.EOFException: нет содержимого для сопоставления с объектом из-за конца ввода,

Например: - InputStream fileIs = JsonServiceList.class.getResourceAsStream ("services.json");

JsonNode jNodeService = new ObjectMapper (). ReadTree(fileIs);

Как только я сделал его доступным во время выполнения, он начал работать.

Я получил ту же проблему, потому что некоторые из моих атрибутов JSON имели значение null. Удаление нулевых значений из JSON полностью избавило от ошибки.

У меня возникла эта проблема, когда я отправляю запрос как метод HTTP GET, после изменения метода HTTP GET на метод HTTP POST, эта проблема решена. Вы можете попробовать, как я говорю, надеюсь, это поможет вам....

Я столкнулся с проблемой, но я использовал curl для отправки запроса.

Исходная команда для раздела данных

-d "{'ID':123, 'Name':'ABC'}"

После того, как я изменил раздел данных на

-d '{"ID":123, "Name":"ABC"}'

проблема была решена.

Я столкнулся с этой проблемой с JAX-RS. я использовал @QueryParam параметр для извлечения параметра запроса URI. Без этого все работало нормально.

Другие вопросы по тегам