2013-09-29 15 views
12

Próbuję wysłać niektóre dane json poprzez JQuery POST do usługi REST Jersey w mojej lokalnej maszynie.Jersey zużywają JSON na POST

Po mojej stronie serwera, mam metodę Jersey do korzystania z tego JSON, który jest POSTed.

@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; 

    } 


} 

Pakuję dane JSON w żądaniu. Tak więc na serwerze mogę uzyskać wszystkie dane wysłane na żądanie w tej klasie opakowania. Moja klasa wrapper na życzenie

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 Pytanie klasa

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(){ 

    } 


} 

Ilekroć złożyć zamówienie z jQuery, jak pokazano poniżej,

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

       } 
      }); 

    } 

otrzymuję ten błąd w konsola:

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"]) 

Mogę to naprawić, wysyłając pytanie json z jquery i akceptując parametr pytania w metodzie. Ale muszę zawinąć wszystkie żądania jquery w TQARequest i zaakceptować wszystkie żądania jako TQARequest, a następnie wyodrębnić z obiektu obiekt pytania. Jak mam to zrobic ?

Moje mapowanie POJO w web.xml jest:

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

Odpowiedz

7

Wierzę, że można uprościć dokument JSON następująco:

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

To wciąż "tqaRequest" przedmiot w tej formie.

Jeśli chcesz wesprzeć listę pytań, twój JSON może wyglądać następująco (tablice JSON przejść w nawiasach kwadratowych):

{ 
    "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" 
     }] 
    } 
} 

I czy dostosowanie klasę TQARequest odwołać:

private List<Question> questions; 

zamiast

private Question question; 
+0

Ale co zrobić, jeśli muszę jeszcze jeden poziom JSON? dla Ex: { "Q1": { "pytanie": { "createdon": "sfddsf" "questionText": "fsdfsd" "questionTrackingURL": „http://www.google. com ", " questionURL ":" ssdf " } } } – cherit

+0

Jeśli dodasz kolejny poziom, będziesz musiał odzwierciedlić to w swoim modelu obiektowym Java.W takim przypadku będziesz miał obiekt TQARequest, owijający obiekt Q1, owijający obiekt Question. Czy możesz jednak dokładniej określić, co chcesz robić? Czy chcesz wziąć listę pytań? –

+0

Tak, potrzebuję wziąć listę pytań wszystko opakowane w TQARequest obiekt od mojej strony html w json. – cherit

3

nadzieję, że to rozwiązuje problem.

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

@Consumes (MediaType.APPLICATION_JSON), ale argumentem jest String. Więc czy powinienem skonsumować MediaType.PLAINTEXT? , Ale to zepsuje moją specyfikację REST, wolę, aby producent i konsument byli w JSON. – cherit

+0

nie jestem pewien, w moim przypadku produkuje 'JSON', ale nie określiłem' @ Consumes', to działa dobrze dla mnie. Czy próbowałeś z istniejącą konfiguracją? tj., z '@ Consumes' jako' JSON' i argumentem jako String. –

+0

Myślę, że nie chodziło o to, jak ręcznie mapować json-string na obiekt, ale raczej o to, jak skonfigurować aplikację Jersey do automatycznego odwzorowania na TQARequest. – iTollu