在Spring MVC中处理JSON请求和返回JSON消息的步骤如下:
1. 添加依赖
确保项目中包含处理JSON的库,如Jackson。
Maven配置(pom.xml):
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
Gradle配置(build.gradle):
implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.3'
2. 启用Spring MVC注解驱动
在Spring Boot中自动配置,非Boot项目需配置<mvc:annotation-driven>或使用Java配置类。
Java配置类示例:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
// 自动注册消息转换器,包括Jackson
}
3. 创建实体类
定义用于接收和返回数据的Java对象。
public class User {
private String name;
private int age;
// 必须有无参构造函数
public User() {}
// Getter和Setter方法
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
4. 编写控制器处理JSON
使用@RestController或@ResponseBody注解返回JSON,@RequestBody接收JSON数据。
示例控制器:
@RestController // 组合了@Controller和@ResponseBody
@RequestMapping("/api/users")
public class UserController {
// 处理POST请求,接收JSON并返回JSON
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
// 模拟业务处理,如保存用户
user.setName(user.getName() + "-processed");
return ResponseEntity.ok(user); // 返回200状态码和JSON数据
}
// 处理GET请求,返回用户列表JSON
@GetMapping
public List<User> getUsers() {
List<User> users = new ArrayList<>();
users.add(new User("Alice", 30));
users.add(new User("Bob", 25));
return users; // 自动转换为JSON数组
}
}
5. 发送JSON请求测试
使用工具(如Postman)或curl命令测试API。
POST请求示例:
• URL: POST http://localhost:8080/api/users
• Headers:
• Content-Type: application/json
• Accept: application/json
• Body (raw JSON):
{
"name": "John",
"age": 28
}
响应示例:
{
"name": "John-processed",
"age": 28
}
6. 关键注解说明
• @RequestBody:将HTTP请求体中的JSON绑定到方法参数的对象上。
• @ResponseBody:将方法返回值直接写入HTTP响应体,而非视图解析。
• @RestController:类级别的注解,组合@Controller和@ResponseBody,所有方法默认返回数据而非视图。
7. 处理复杂场景
• 日期格式化:在实体类字段使用@JsonFormat。
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthDate;
• 忽略未知字段:在类上添加@JsonIgnoreProperties(ignoreUnknown = true),避免JSON包含未定义字段时报错。
• 自定义序列化/反序列化:实现JsonSerializer或JsonDeserializer,并通过@JsonSerialize和@JsonDeserialize指定。
8. 异常处理
全局处理JSON解析异常,返回友好错误信息。
示例异常处理类:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity<Map<String, String>> handleJsonParseException(HttpMessageNotReadableException ex) {
Map<String, String> error = new HashMap<>();
error.put("error", "Invalid JSON format");
error.put("details", ex.getMessage());
return ResponseEntity.badRequest().body(error);
}
}
9. 验证JSON数据
结合JSR-303验证框架,确保输入数据合法。
示例:
@PostMapping
public ResponseEntity<?> createUser(@Valid @RequestBody User user, BindingResult result) {
if (result.hasErrors()) {
// 返回验证错误信息
return ResponseEntity.badRequest().body(result.getAllErrors());
}
// 处理有效数据
return ResponseEntity.ok(user);
}
实体类添加验证注解:
public class User {
@NotBlank(message = "Name is required")
private String name;
@Min(value = 0, message = "Age must be positive")
private int age;
}
10. 配置Spring Boot(可选)
在Spring Boot中,默认已配置Jackson,只需添加spring-boot-starter-web依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
小结
通过上述步骤,Spring MVC能够高效处理JSON请求和响应,关键在于正确使用注解和配置消息转换器。Spring Boot进一步简化了配置,使开发者更专注于业务逻辑。
在 Spring MVC 中,除了 JSON 请求,常见的请求内容类型还包括以下几种形式。以下是它们的用途、处理方式及代码示例:
1. 表单数据(application/x-www-form-urlencoded)
• 场景:传统的 HTML 表单提交(非 AJAX)。
• 数据格式:键值对,如 name=John&age=25。
• Spring MVC 处理方式:
• 使用 @RequestParam 接收单个参数。
• 使用 @ModelAttribute 绑定到对象。
示例代码:
@PostMapping("/form")
public String handleForm(
@RequestParam String name,
@RequestParam int age) {
// 处理逻辑
return "success";
}
// 或绑定到对象
public class User {
private String name;
private int age;
// getters/setters
}
@PostMapping("/form-object")
public String handleFormObject(@ModelAttribute User user) {
// user.getName(), user.getAge()
return "success";
}
2. 多部分文件上传(multipart/form-data)
• 场景:上传文件(如图片、文档)。
• 数据格式:分段传输,支持文件二进制数据。
• 依赖:需添加 spring-boot-starter-web(默认包含 Multipart 支持)。
• Spring MVC 处理方式:
• 使用 @RequestParam 和 MultipartFile 接收文件。
示例代码:
@PostMapping("/upload")
public String uploadFile(
@RequestParam("file") MultipartFile file,
@RequestParam String description) {
if (!file.isEmpty()) {
String fileName = file.getOriginalFilename();
// 保存文件到磁盘或云存储
}
return "redirect:/success";
}
配置上传文件大小限制(application.yml):
spring:
servlet:
multipart:
max-file-size: 10MB # 单个文件最大大小
max-request-size: 100MB # 整个请求最大大小
3. XML 数据(application/xml 或 text/xml)
• 场景:传统企业级系统或 SOAP 协议交互。
• 依赖:需添加 XML 解析库(如 JAXB)。
• Spring MVC 处理方式:
• 使用 @RequestBody 绑定 XML 到对象。
示例代码:
@PostMapping(value = "/xml", consumes = MediaType.APPLICATION_XML_VALUE)
public ResponseEntity<User> handleXml(@RequestBody User user) {
// 处理 XML 数据
return ResponseEntity.ok(user);
}
实体类需添加 JAXB 注解:
@XmlRootElement
public class User {
private String name;
private int age;
// getters/setters
}
4. 纯文本(text/plain)
• 场景:接收简单文本(如日志、配置)。
• Spring MVC 处理方式:
• 直接读取请求体内容。
示例代码:
@PostMapping(value = "/text", consumes = MediaType.TEXT_PLAIN_VALUE)
public String handleText(@RequestBody String text) {
// 处理纯文本
return "Processed: " + text;
}
5. 二进制数据(application/octet-stream)
• 场景:传输二进制文件(如图片、视频、Protobuf 数据)。
• Spring MVC 处理方式:
• 通过 InputStream 或 byte[] 接收原始数据。
示例代码:
@PostMapping(value = "/binary", consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public void handleBinary(InputStream inputStream) {
// 读取二进制流
try (InputStream is = inputStream) {
byte[] data = is.readAllBytes();
// 处理数据
} catch (IOException e) {
e.printStackTrace();
}
}
6. GraphQL 查询
• 场景:复杂数据查询(替代 REST API)。
• 数据格式:GraphQL 查询字符串。
• 依赖:需集成 graphql-java 或 spring-graphql。
• 处理方式:通过专用端点处理查询。
示例代码:
@PostMapping(value = "/graphql", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Map<String, Object>> handleGraphQL(@RequestBody Map<String, String> request) {
String query = request.get("query");
// 执行 GraphQL 查询
return ResponseEntity.ok(result);
}
7. Protocol Buffers(Protobuf)
• 场景:高性能、跨语言数据交换(如微服务通信)。
• 依赖:需添加 Protobuf 依赖。
• Spring MVC 处理方式:
• 使用 @RequestBody 绑定到 Protobuf 生成的类。
示例代码:
@PostMapping(value = "/proto", consumes = "application/x-protobuf")
public ResponseEntity<UserProto.User> handleProto(@RequestBody UserProto.User user) {
// 处理 Protobuf 数据
return ResponseEntity.ok(user);
}
总结:常见请求类型对比
| 内容类型 | 用途 | Spring MVC 处理方式 |
|---|---|---|
application/json | API 数据交互 | @RequestBody + 对象 |
application/x-www-form-urlencoded | HTML 表单提交 | @RequestParam 或 @ModelAttribute |
multipart/form-data | 文件上传 | MultipartFile |
application/xml | XML 数据交互 | @RequestBody + JAXB 注解 |
text/plain | 纯文本传输 | @RequestBody String |
application/octet-stream | 二进制文件传输 | InputStream 或 byte[] |
注意事项
- 明确指定
consumes:
在@PostMapping中指定consumes属性以限制接受的请求类型:@PostMapping(value = "/data", consumes = MediaType.APPLICATION_XML_VALUE) - 依赖管理:
XML 需要 JAXB,Protobuf 需要 Protobuf 库,GraphQL 需要对应框架。 - 异常处理:
全局捕获HttpMediaTypeNotSupportedException,返回友好的错误提示。
通过灵活使用这些内容类型,可以满足不同场景下的 HTTP 请求处理需求。

3619

被折叠的 条评论
为什么被折叠?



