Преобразование HttpServletRequest, содержащего json, в POJO — java.lang.Исключение IllegalStateException

#java #json #gson

#java #json #gson

Вопрос:

Я пытаюсь использовать надстройку poster для отправки запроса json. Я отправляю запрос функции для чтения json и создания объекта InputDTO. Кажется, что выполняется find, но когда я вызываю функцию для получения присвоенного значения, она выдает java.lang.Ошибка исключения NullPointerException. Я нашел этот учебник и попытался его использовать. http://edwin.baculsoft.com/2011/11/how-to-create-a-simple-servlet-to-handle-json-requests /

Казалось, это именно то, что мне нужно, но оно не работает. Вот фрагменты кода для того, что я делаю. Может кто-нибудь, пожалуйста, помочь с этим?

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 try (PrintWriter pw = response.getWriter())
        {
            InputDTO inputJson = XMLReader.inputFromJson(request);
            pw.println("before the call to get timezone from the input DTO");
            pw.println(inputJson.getTimeZone());
            pw.println("after the call to get timezone from the input DTO");
  

вот код для XmlReader.inputFromjson(запрос)

  public static InputDTO inputFromJson(HttpServletRequest request) throws IOException {
        InputDTO inputDTO = null;
        Gson gson = new Gson();

            logger.debug("before the fromJson call");
            inputDTO = gson.fromJson(request.getReader(), InputDTO.class);
            logger.debug("after the fromJson call");


        return inputDTO;

    }
  

Строка, которая завершается ошибкой, является

 pw.println(inputJson.getTimeZone());
  

Единственными методами, которые есть у InputDTO, являются

 public String getTimeZone() {
    return timeZone;
}

public void setTimeZone(String timeZone) {
    this.timeZone = timeZone;
}
  

Это запрос, который я отправляю:

 {"request":[
{"timeZone":"CST"}
]}
  

Добавлено: трассировка стека

 Week3 threw exception
java.lang.NullPointerException
at com.week3.Week3.doPost(Week3.java:136)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at com.ta.aa.dao.catalina.DAOValve.invoke(Unknown Source)
at com.ta.aa.catalina.realm.SingleSignOn.invoke(SingleSignOn.java:631)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:724)
  

Пожалуйста, дайте мне знать, если вы можете помочь.

Спасибо!

Комментарии:

1. Опубликуйте полную трассировку стека

2. Выполнено. пожалуйста, смотрите выше.

3. Эта трассировка стека не соответствует тому, что вы говорите. Кажется, вы sendError куда-то звоните.

4. я понимаю. в операторе catch был вызов sendError . Я понял, что теперь я получаю нулевой указатель. вызвал исключение java.lang. Исключение NullPointerException в com.homedepot.week3.Week3.doPost(Week3.java:136) в javax.servlet.http. HttpServlet.service(HttpServlet.java:643)

5. Пожалуйста, помогите нам помочь вам… Что это за строка? Что такое null ? Это возвращаемое значение getTimeZone() ?

Ответ №1:

Имена должны совпадать в json и классе. Данные, которые вы отправляете в json, и ваше определение класса не совпадают. Измените определение вашего класса.

 class Request{

String tz;

public String gettz() {
    return tz;
}

public void settz(String tz) {
    this.tz= tz;
}

}
class InputDTO {

Request request;

public String getrequest() {
    return request;
}

public void setrequest(Request request) {
    this.request= request;
}

}
  

Комментарии:

1. Хотя это верно, оно не устраняет основную причину, как указано в OP.

2. И это все равно не сработает. Корневой объект JSON содержит request , а не tz или timeZone . И он содержит массив JSON.

3. я изменил это и отключил вызов «sendError», который был упомянут выше, и теперь я получаю нулевой указатель. я опубликовал часть трассировки стека выше

4. извините, я сделал это в комментариях выше. теперь это в сообщении.

5. Похоже inputJson , есть null . И это, скорее всего, потому, что ваши сопоставления неверны. inputFromJson() возвращает значение null. Исправьте ваши сопоставления.