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>
<!--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;}-->
</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 самостоятельно.