Spring 3.2 Проверка @RequestParam возвращает HTML вместо JSON

Следующий блок кода взят из пружинного контроллера для REST API

@RequestMapping(value = "/addExpense", method = RequestMethod.POST,  produces="application/json")
public void createExpense(
            @RequestParam(value="expenseDate" ,required=true)   @DateTimeFormat(pattern="yyyy-MM-dd") Date expenseDate,
            @RequestParam(value="description" , required=true) String description,
            @RequestParam(value="amount" , required=true) Double amount){
// Create Expense
}

Конфиг имеет эту запись

<mvc:annotation-driven/> 

Теперь проблема в том, что если какая-либо из вышеперечисленных проверок завершится неудачно, я получаю ответ, который является HTML. не нашел способ сделать это JSON. Кто-нибудь?

<html>
  <head>
    <title>
      JBoss Web/7.0.13.Final - Error report
    </title>
    <style>
      &lt;!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--&gt;
    </style>
  </head>
  <body>
    <h1>
      HTTP Status 400 - Required String parameter 'description' is not present
    </h1>
    <hr noshade="noshade" size="1"/>
    <p>
      <b>
        type
      </b>
      Status report
    </p>
    <p>
      <b>
        message
      </b>
      <u>
        Required String parameter 'description' is not present
      </u>
    </p>
    <p>
      <b>
        description
      </b>
      <u>
        The request sent by the client was syntactically incorrect (Required String parameter 'description' is not present).
      </u>
    </p>
    <hr noshade="noshade" size="1"/>
    <h3>
      JBoss Web/7.0.13.Final
    </h3>
  </body>
</html>

1 ответ

Один из способов сделать это - объединить сильные стороны контейнера сервлетов и Spring.

Объявить error-page в вашем дескрипторе развертывания

<error-page>
    <error-code>400</error-code>
    <location>/400</location>
</error-page>

Когда Spring не сможет найти подходящий параметр запроса (или по ряду других причин), он выдаст Exception это будет обработано DefaultHandlerExceptionResolver вернув код состояния 400. error-page поймает это и будет использовать RequestDispatcher в forward к пути в locationпосле установки сообщения об ошибке в атрибутах запроса (между прочим).

location может быть любым точным путем, для которого вы предоставите метод-обработчик. Что-то вроде

@RequestMapping(value = "/400")
public @ResponseBody String handle(HttpServletRequest request) {
    String e = (String) request.getAttribute(javax.servlet.RequestDispatcher.ERROR_MESSAGE);
    System.out.println(e);
    return "400";
}

Я, очевидно, не возвращаю JSON здесь. Вместо этого я покажу вам, как получить сообщение об ошибке. Исходя из этого, вы можете создать POJO и вернуть его для сериализации в JSON с @ResponseBody или вы можете создать JSON самостоятельно.

Другие вопросы по тегам