Довольно часто вам нужно предоставлять пользователям одни и те же данные, но в разных формах, таких как JSON, PDF, XLS и т. Д. Если ваше приложение основано на Spring Framework, эту задачу можно решить с помощью конвертеров сообщений HTTP.
Конвертеры HTTP-сообщений применяются, когда HTTP-запрос (или его части) необходимо преобразовать в тип, необходимый для аргумента метода-обработчика (см. Методы-обработчики — аргументы метода ) , или когда значение, возвращаемое методом-обработчиком, необходимо каким-либо образом преобразовать для создания HTTP-ответа. (см .: Методы-обработчики — Возвращаемые значения ).
Spring Framework предоставляет вам набор предопределенных конвертеров HTTP-сообщений, например. для байтовых массивов, JSON и т. д. — этот набор можно изменить или расширить в соответствии с вашими потребностями.
В этом посте мы сконцентрируемся на преобразовании значения, возвращенного из метода-обработчика, в желаемую форму, используя предоставленный мной пример (см. Ниже ссылку на репозиторий исходного кода).
Предположим, что у нас есть контроллер, возвращающий некоторые данные Team , например, так (да, я знаю, я проигнорировал идентификатор команды)
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
@RestControllerpublic class TeamDetailsController { @GetMapping("/teams/{teamId}/") public Team read() { final Set<TeamMember> members = new LinkedHashSet<>(); members.add(new TeamMember("Albert Einstein", LocalDate.of(1879, 3, 14))); members.add(new TeamMember("Benjamin Franklin", LocalDate.of(1706, 1, 17))); members.add(new TeamMember("Isaac Newton", LocalDate.of(1643, 1, 4))); return new Team(members); }} |
В нашем примере ответ метода-обработчика будет по умолчанию преобразован в JSON:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
{ "members": [ { "dateOfBirth": "1879-03-14", "name": "Albert Einstein" }, { "dateOfBirth": "1706-01-17", "name": "Benjamin Franklin" }, { "dateOfBirth": "1643-01-04", "name": "Isaac Newton" } ]} |
Если мы хотим преобразовать данные, возвращаемые обработчиком, в файл XLS, мы можем просто определить bean-компонент, являющийся реализацией конвертера HTTP-сообщения, который будет активирован заголовком HTTP Accept :
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
@Servicepublic class TeamToXlsConverter extends AbstractHttpMessageConverter<Team> { private static final MediaType EXCEL_TYPE = MediaType.valueOf("application/vnd.ms-excel"); TeamToXlsConverter() { super(EXCEL_TYPE); } @Override protected Team readInternal(final Class<? extends Team> clazz, final HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { return null; } @Override protected boolean supports(final Class<?> clazz) { return (Team.class == clazz); } @Override protected void writeInternal(final Team team, final HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { try (final Workbook workbook = new HSSFWorkbook()) { final Sheet sheet = workbook.createSheet(); int rowNo = 0; for (final TeamMember member : team.getMembers()) { final Row row = sheet.createRow(rowNo++); row.createCell(0) .setCellValue(member.getName()); } workbook.write(outputMessage.getBody()); } }} |
Следует иметь в виду, что в нашем примере определенный конвертер HTTP-сообщений будет применяться всегда, когда метод-обработчик возвращает значение типа Team (см. Раздел «Поддерживает метод»), а заголовок HTTP Accept соответствует «application / vnd.ms-excel». В этом случае XLS-файл, сгенерированный конвертером HTTP-сообщений, возвращается вместо JSON-представления Team .
Несколько ссылок на десерт:
|
Смотрите оригинальную статью здесь: Spring MVC — HTTP конвертер сообщений Мнения, высказанные участниками Java Code Geeks, являются их собственными. |