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乾貨
在這裏插入圖片描述

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