首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring MVC 學習資料整理:@RequestBody/@ResponseBody 實現 Java 對象與 XML/JSON 自動轉換

     編輯:Java 綜合教學

Spring MVC 學習資料整理:@RequestBody/@ResponseBody 實現 Java 對象與 XML/JSON 自動轉換

Spring MVC 通過 HttpMessageConverter 機制實現請求體/響應體與 Java 對象的自動雙向轉換。本文整理核心註解用法、配置要點、常見轉換器、避坑指南,並推薦優質學習資源鏈接。

核心註解

典型 Controller 寫法


@RestController
@RequestMapping("/api/users")
public class UserController {

    @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
    public User create(@RequestBody @Valid UserDTO dto) {
        // 自動將 JSON 反序列化為 UserDTO
        return userService.save(dto);
    }

    @GetMapping("/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
    public User get(@PathVariable Long id) {
        // 自動將 User 序列化為 JSON
        return userService.findById(id);
    }

    @GetMapping(value = "/{id}/xml", produces = MediaType.APPLICATION_XML_VALUE)
    public User getXml(@PathVariable Long id) {
        // 同樣對象,根據 produces 自動輸出 XML
        return userService.findById(id);
    }
}

HttpMessageConverter 自動配置與自定義

Spring Boot 默認註冊以下轉換器(優先級順序):

  1. ByteArrayHttpMessageConverter (application/octet-stream)
  2. StringHttpMessageConverter (text/plain)
  3. ResourceHttpMessageConverter (application/octet-stream)
  4. MappingJackson2HttpMessageConverter (application/json, **依賴 jackson-databind**)
  5. MappingJackson2XmlHttpMessageConverter (application/xml, **依賴 jackson-dataformat-xml**)
  6. Jaxb2RootElementHttpMessageConverter (application/xml, 依賴 JAXB)

添加 XML 支持 (Spring Boot 2.x/3.x)


<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

實體類雙註解:


@Data
@JacksonXmlRootElement(localName = "user")
public class User {
    @JacksonXmlProperty(isAttribute = true)
    private Long id;
    private String name;
    private String email;
}

常見問題與解決

註解位置作用
@RequestBody方法參數將 HTTP 請求體(JSON/XML)反序列化為 Java 對象
@ResponseBody方法上/返回值將 Java 對象序列化為 JSON/XML 寫入 HTTP 響應體
@RestController類上@Controller + @ResponseBody 組合,所有方法默認響應體序列化

推薦學習資源

  1. Spring MVC 中使用 @RequestBody/@ResponseBody 實現 Java 對象和 XML/JSON 數據自動轉換(上):CSDN 文章
  2. springmvc 實現 Java 對象和 XML/JSON 數據自動轉換(上):博客園/CSDN 同步
  3. 官方文檔:Spring Reference - @RequestBody

進階:自定義 HttpMessageConverter


public class CustomProtobufHttpMessageConverter extends AbstractHttpMessageConverter {
    public CustomProtobufHttpMessageConverter() {
        super(new MediaType("application", "x-protobuf"));
    }
    @Override protected boolean supports(Class clazz) { return User.class.isAssignableFrom(clazz); }
    @Override protected User readInternal(Class clazz, HttpInputMessage input) throws IOException {
        return User.parseFrom(input.getBody());
    }
    @Override protected void writeInternal(User user, HttpOutputMessage output) throws IOException {
        output.getBody().write(user.toByteArray());
    }
}

// 配置類註冊
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List> converters) {
        converters.add(new CustomProtobufHttpMessageConverter());
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
現象原因解決
415 Unsupported Media Type請求 Content-Type 不匹配 consumes客戶端設置正確 Content-Type,或服務端擴展 consumes
406 Not Acceptable請求 Accept 不匹配 produces客戶端設置 Accept: application/json,或服務端擴展 produces
JSON 日期格式錯誤默認時間戳數字配置 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss 或 @JsonFormat
循環引用導致 StackOverflow雙向關聯 (A→B→A)@JsonIgnore / @JsonManagedReference+@JsonBackReference / DTO 隔離
字段為 null 不輸出默認包含 null@JsonInclude(JsonInclude.Include.NON_NULL) 類/字段級
大數字精度丟失 (Long→JS)JS Number 53 位精度Long 序列化為 String:@JsonSerialize(using = ToStringSerializer.class)