泽西岛在 POST 上使用 JSON

2022-09-02 22:12:54

我正在尝试通过jquery POST将一些json数据发送到我本地计算机中的JERS REST服务。

在我的服务器端,我有泽西岛方法来使用这个被POSTed的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: org.mortbay.jetty.HttpParser$Input@899e3e; line: 1, column: 16] (through reference chain: com.netsquid.tqa.entity.TQARequest["tqaRequest"])

我可以通过从jquery发送Question json并在方法中接受问题参数来解决此问题。但是我需要将所有jquery请求包装在TQARequest中,并将所有请求作为TQARequest接受,然后从中提取问题对象。我该怎么做?

我在 web.xml 中的 POJO 映射是:

    <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());
 }
}

推荐