web-dev-qa-db-ja.com

Jerseyは、POSTでJSONを消費します

Jquery POST= jerseyにRESTサービスをローカルマシンで送信します。

サーバー側には、JSONメソッドを使用して、このJSONをPOSTします。

@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 + "]";
    }



}

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を送信し、メソッドでquestionパラメーターを受け入れます。 ただし、すべての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>
13
cherit

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;
7
Michael Doyle

これで問題が解決することを願っています。

@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());
 }
}
4
Syed Shahul