jquery POST 経由でローカル マシンの jersey REST サービスに json データを送信しようとしています。
私のサーバー側では、POST されたこの JSON を使用するための Jersey メソッドがあります。
@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データをラップしています。server で、そのラッパークラスでリクエストで送信されたすべてのデータを取得できるようにします。リクエストのラッパークラスは
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>