Джерси потребляют JSON на POST

Я пытаюсь отправить некоторые данные json через jQuery POST на службу REST на Джерси на моей локальной машине.

На моей стороне сервера, у меня есть метод Джерси, чтобы использовать этот JSON, который отправляется.

@Path("/question")
public class QuestionAPI {


    private final static Logger LOGGER = Logger.getLogger(HelloWorldApi.class .getName());

     @POST
     @Path("/askquestion")
     @Produces(MediaType.APPLICATION_JSON)
     @Consumes(MediaType.APPLICATION_JSON)
     public TQARequest askquestion(TQARequest tqaRequest, @Context HttpServletRequest request) {

         LOGGER.info("Inside-->askquestion-->TQARequest"+tqaRequest.getQuestion());

         return tqaRequest;

     }


}

Я обрабатываю данные json в запросе. Так что на сервере я могу получить все данные, отправленные по запросу в этом классе-оболочке. Мой класс-оболочка для запроса

public class TQARequest {

    private Question question;

    public Question getQuestion() {
        return question;
    }

    public void setQuestion(Question question) {
        this.question = question;
    }

    @Override
    public String toString() {
        return "TQARequest [question=" + question + "]";
    }



}

Класс класса pojo

public class Question {

    @Id
    private Long questionID;

    private String questionText;

    private long createdOn;

    private String questionURL;

    private String questionTrackingURL;

    @Override
    public String toString() {
        return "Question [questionID=" + questionID + ", questionText="
                + questionText + ", createdOn=" + createdOn + ", questionURL="
                + questionURL + ", questionTrackingURL=" + questionTrackingURL
                + "]";
    }

    public Question(String questionText, long createdOn, String questionURL,
            String questionTrackingURL) {
        super();
        this.questionText = questionText;
        this.createdOn = createdOn;
        this.questionURL = questionURL;
        this.questionTrackingURL = questionTrackingURL;
    }

    public Long getQuestionID() {
        return questionID;
    }

    public void setQuestionID(Long questionID) {
        this.questionID = questionID;
    }

    public String getQuestionText() {
        return questionText;
    }

    public void setQuestionText(String questionText) {
        this.questionText = questionText;
    }

    public long getCreatedOn() {
        return createdOn;
    }

    public void setCreatedOn(long createdOn) {
        this.createdOn = createdOn;
    }

    public String getQuestionURL() {
        return questionURL;
    }

    public void setQuestionURL(String questionURL) {
        this.questionURL = questionURL;
    }

    public String getQuestionTrackingURL() {
        return questionTrackingURL;
    }

    public void setQuestionTrackingURL(String questionTrackingURL) {
        this.questionTrackingURL = questionTrackingURL;
    }

    public Question(){

    }


}

Всякий раз, когда я делаю запрос из jquery, как показано ниже,

 function askQuestion(){


        $.ajax({
              type: "POST",
              contentType: "application/json; charset=utf-8",
              url: "/api/question/askquestion",
              data: 
               JSON.stringify({
                   "tqaRequest" : {
                          "question" : {
                             "createdOn" : "sfddsf",
                             "questionText" : "fsdfsd",
                             "questionTrackingURL" : "http://www.google.com",
                             "questionURL" : "ssdf"
                          }
                       }
                    }

                     ),
              dataType: "json",
              success: function(response){

                  console.log(response);

              }
            });  

    }

Я получаю эту ошибку в консоли:

WARNING: /api/question/askquestion: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "tqaRequest" (Class com.netsquid.tqa.entity.TQARequest), not marked as ignorable
 at [Source: [email protected]; line: 1, column: 16] (through reference chain: com.netsquid.tqa.entity.TQARequest["tqaRequest"])

Я могу исправить это, отправив Question json из jquery и приняв параметр вопроса в методе. Но мне нужно обернуть все запросы jquery в TQARequest и принять весь запрос как TQARequest, а затем извлечь объект вопроса из него. Как это сделать?

Отображение моего POJO в web.xml:

    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>

Ответ 1

Я считаю, что вы можете упростить документ JSON следующим образом:

{
    "question" : {
        "createdOn" : "sfddsf",
        "questionText" : "fsdfsd",
        "questionTrackingURL" : "http://www.google.com",
        "questionURL" : "ssdf"
    }
}

Он все еще является объектом "tqaRequest" в этой форме.

Если вы хотите поддержать список вопросов, ваш JSON может выглядеть так (массивы JSON входят в квадратные скобки):

{
    "questions" : [
        {
            "createdOn" : "date 1",
            "questionText" : "question 1",
            "questionTrackingURL" : "http://www.google.com",
            "questionURL" : "question 1 url"
        },
        {
            "createdOn" : "date 2",
            "questionText" : "question 2",
            "questionTrackingURL" : "http://www.google.com",
            "questionURL" : "question 2 url"
        }]
    }
}

И вы отредактируете свой класс TQARequest для ссылки:

private List<Question> questions;

вместо

private Question question;

Ответ 2

Надеюсь, что это решает проблему.

@POST
@Path("/askquestion")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public TQARequest askquestion(String jsonRequest){       
         TQARequest tqaRequest = MapperUtil
                                  .readAsObjectOf(TQARequest.class, jsonRequest);
    }

MapperUtil.java

com.fasterxml.jackson.databind.ObjectMapper MAPPER = new ObjectMapper();

 public static <T> T readAsObjectOf(Class<T> clazz, String value)
          throws MYPException {
 try {
      return MAPPER.readValue(value, clazz);
      } catch (Exception e) {
      LOGGER.error("{}, {}", e.getMessage(), e.fillInStackTrace());
 }
}