Статьи

Spring MVC — конвертер HTTP-сообщений

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