Jersey 2.27 Невозможно обработать POST

Я новичок в Джерси и пытаюсь реализовать обработчик POST для простого ресурса REST Student, состоящего из имени и CIP, который представляет собой другую строку. Я использую Tomcat 8.5:

public class StudentResource {

    String m_name;
    String m_cip;

    public StudentResource(String p_name, String p_cip) { 
        m_name = p_name;
        m_cip = p_cip;
    }

    public String getName() {
        return m_name;
    }

    public void setName(String p_name) {
        m_name = p_name;
    }

    public String getCip() {
        return m_cip;
    }

    public void setCip(String p_cip) {
        m_cip = p_cip;
    }
}

Обработчик POST:

@Path("students")
public class StudentResourceHandler {

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public StudentResource onNewStudent(StudentResource p_newStudent) {
        return p_newStudent
    }
}

Я хочу вернуть только то, что я опубликовал ... Я смог обработать JSON без ошибок в моем обработчике GET (т.е. возврат JSON работает), но каким-то образом обработчик POST всегда терпит неудачу с этим исключением:

javax.servlet.ServletException: javax.ws.rs.ProcessingException: Error deserializing object from entity stream.

Я использую RESTClient для выполнения своих запросов. Вот запрос, который мне не подходит:

заголовок:

  Content-Type : application/json

тело:

  {
    "cip": "gmar2104",
    "name": "Marcel"
  }

В том, что я делаю, определенно что-то не так, но я не могу понять, почему. Любая помощь будет оценена по достоинству. Спасибо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
616
1

Ответы 1

Если у вас нет конструктора по умолчанию, Джексон не сможет создать экземпляр.

Попробуйте добавить конструктор по умолчанию:

public class StudentResource {

    String m_name;
    String m_cip;

    public StudentResource(String p_name, String p_cip) { 
        m_name = p_name;
        m_cip = p_cip;
    }

    //Default constructor 
    public StudentResource() {
    }

    public String getName() {
        return m_name;
    }

    public void setName(String p_name) {
        m_name = p_name;
    }

    public String getCip() {
        return m_cip;
    }

    public void setCip(String p_cip) {
        m_cip = p_cip;
    }
}

Это была одна проблема! Еще одна проблема заключается в том, что я не добавил аннотацию @XmlRootElement к моему классу ресурсов. Если вы добавите это к своему ответу, я приму это.

BobMorane 03.06.2018 14:28

Джексон может создать экземпляр с нестандартным конструктором, используя @JsonCreator.

Mincong Huang 03.06.2018 22:11

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