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