| 註解 | 位置 | 作用 |
@RequestBody | 方法參數 | 將 HTTP 請求體(JSON/XML)反序列化為 Java 對象 |
@ResponseBody | 方法上/返回值 | 將 Java 對象序列化為 JSON/XML 寫入 HTTP 響應體 |
@RestController | 類上 | @Controller + @ResponseBody 組合,所有方法默認響應體序列化 |
典型 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 默認註冊以下轉換器(優先級順序):
ByteArrayHttpMessageConverter (application/octet-stream)
StringHttpMessageConverter (text/plain)
ResourceHttpMessageConverter (application/octet-stream)
MappingJackson2HttpMessageConverter (application/json, **依賴 jackson-databind**)
MappingJackson2XmlHttpMessageConverter (application/xml, **依賴 jackson-dataformat-xml**)
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;
}
常見問題與解決
| 現象 | 原因 | 解決 |
| 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) |
推薦學習資源
- Spring MVC 中使用 @RequestBody/@ResponseBody 實現 Java 對象和 XML/JSON 數據自動轉換(上):CSDN 文章
- springmvc 實現 Java 對象和 XML/JSON 數據自動轉換(上):博客園/CSDN 同步
- 官方文檔: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 extends User> 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());
}
}
- 上一篇文章: Java 集合框架全景圖:Collection/Map 體系、數組 vs 集合、選型指南與源碼級核心原理
- 下一篇文章: 從 Visual Studio 轉戰 Eclipse 快速上手指南:漢化、編輯器配置、智能提示、快捷鍵與格式化模板
Copyright ©
程式碼之家 All Rights Reserved