Spring MVC:HTTP消息转换器

了解有关Spring MVC和HTTP消息转换器的更多信息。

通常,你需要为用户提供相同的数据,但是以不同的形式(例如JSON,PDF,XLS等)为用户提供。如果你的应用程序是基于Spring Framework的,则可以使用HTTP消息转换器来完成此任务。

需要将HTTP请求(或其部分)转换为处理程序方法参数所需的类型(有关更多信息,请参阅处理程序方法—方法参数)时,或者需要处理程序方法返回值时,将应用HTTP消息转换器。 转换为创建HTTP响应的方式(有关更多信息,请参见处理程序方法-返回值)。

Spring框架为你提供了一组预定义的HTTP消息转换器。 例如,对于字节数组,JSON等,可以修改或扩展此集合以最适合你的需求。

在本文中,我们将重点介绍如何使用稍后提供的示例将处理程序方法返回的值转换为所需的形式(请参阅下面的链接以查看源代码存储库)。
假设我们有一个控制器返回一些Team数据,像这样(是的,我知道,我已经忽略了teamId):

@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:

{
  "members": [
    {
      "dateOfBirth": "1879-03-14",
      "name": "Albert Einstein"    },
    {
      "dateOfBirth": "1706-01-17",
      "name": "Benjamin Franklin"    },
    {
      "dateOfBirth": "1643-01-04",
      "name": "Isaac Newton"    }
  ]
}

If 如果我们想将处理程序返回的数据转换为XLS文件,我们可以简单地将一个bean定义为HTTP消息转换器实现,它将由HTTPAccept标头激活:

@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());
        }
    }
}

你必须记住,在我们的示例中,当处理程序方法返回Team类型的值(请参阅支持方法)且HTTP接受标头匹配``application / vnd.ms-excel’'时,将始终应用定义的HTTP消息转换器 ”。 在这种情况下,将返回HTTP消息转换器生成的XLS文件而不是Team的JSON表示形式。

喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等
如果你对java技术很感兴趣欢迎加入Java技术交流防脱发群907135806交流学习,共同学习进步。
不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代
在这里插入图片描述

文章写道这里,欢迎完善交流。最后奉上近期整理出来的一套完整的java架构思维导图,分享给大家对照知识点参考学习。有更多JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git等Java干货
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章