1

Для примера предположим, что я хочу создать конечную точку 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.

+0

Возможный дубликат [Spring MVC Rest Service Controller с обработкой ошибок, выполненный правильно?] (Http://stackoverflow.com/questions/16295184/spring-mvc-rest-service-controller-with-error-handling-done- справа) –

+0

@EngineerDollery Спасибо за ваш вклад. Хотя ссылки показывают некоторые умные способы устранения ошибок, он не показывает способы возврата различных типов классов/json-ified объектов, кроме того, что происходит из общего класса. Поэтому я думаю, что это не полностью касается моего вопроса. Я отредактирую свой вопрос, чтобы лучше описать, чего я хочу избежать. – Marged

+1

Любые причины не использования ResponseEntity , или ResponseEntity ? –

ответ

4

В случае с ResponseEntity Spring MVC не заботится о параметризованном возвратном типе, он заботится только о значении.

Вы можете просто предоставить

public ResponseEntity<?> getMotd(@RequestParam(value = "day") int day { 

Spring MVC-х HttpEntityMethodProcessor, который обрабатывает значения, возвращаемые вашими методами обработчика, которые типа ResponseEntity, будет извлекать body из ResponseEntity и передать записи в ответ на соответствующий HttpMessageConverter ,

Тот же процесс будет происходить для значения Motd, как и для значения Status.

Смежные вопросы