Для примера предположим, что я хочу создать конечную точку REST, которая возвращает сообщение дня (motd). Входящий параметр - это день, представленный числом, результатом которого является JSON, который содержит день и сообщение.Spring MVC: пусть RestController сериализует различные классы для JSON
public class Motd {
int day;
String message;
...
}
Это переводится в ...
{
"day": 1,
"message": "whatever you want to say here"
}
... и возвращается к этому коду:
@RequestMapping(value = "/motd", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseEntity<Motd> getMotd(@RequestParam(value = "day") int day {
...
return new ResponseEntity<Motd>(motd, HttpStatus.OK);
}
Это прекрасно работает, пока все в порядке, но мое намерение для возврата кода статуса http и JSON, объясняющего причину любых ошибок, которые могут возникнуть:
...
if(day > 365) {
Status error = new Status("failed", "can't go beyond 365 days");
return new ResponseEntity<Status>(error, HttpStatus.BAD_REQUEST);
}
...
Но это противоречит определению ResponseEntity<Motd>
. Единственным решением, которое я знаю до сих пор, является определение ResponseEntity<String>
и сериализация JSON самостоятельно. Существуют ли альтернативы/более элегантные альтернативы, которые позволяют Spring «менять» классы?
Акцент моего вопроса заключается не в обработке ошибок, я показал некоторые умные способы сделать это, например, based on exceptions. И по возможности я хочу избежать получения всех возможных возвращенных классов из общего базового класса.
Мой код основан на Spring Boot 1.3 RC1.
Возможный дубликат [Spring MVC Rest Service Controller с обработкой ошибок, выполненный правильно?] (Http://stackoverflow.com/questions/16295184/spring-mvc-rest-service-controller-with-error-handling-done- справа) –
@EngineerDollery Спасибо за ваш вклад. Хотя ссылки показывают некоторые умные способы устранения ошибок, он не показывает способы возврата различных типов классов/json-ified объектов, кроме того, что происходит из общего класса. Поэтому я думаю, что это не полностью касается моего вопроса. Я отредактирую свой вопрос, чтобы лучше описать, чего я хочу избежать. – Marged
Любые причины не использования ResponseEntity