常用注解

时间:2024-10-13 18:17:00
  • @PathVariable:用于从URL路径中提取变量。
  • @RequestHeader:用于从HTTP请求头中获取数据。
  • @ModelAttribute:用于获取请求参数(包括URL参数和POST请求的表单数据),也可以用于将数据绑定到对象上。
  • @RequestParam:用于获取URL参数。
  • @CookieValue:用于获取请求中的Cookie值。
  • @RequestBody:用于获取请求体中的数据,通常用于处理POST请求中的JSON或XML数据。

java代码示例(普通)

import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;

@RestController
@RequestMapping("/api")
public class DataController {

    // 使用 @PathVariable 从URL路径中获取变量
    @GetMapping("/path/{userId}/profile")
    public String getPathVariable(@PathVariable String userId) {
        return "User ID from Path Variable: " + userId;
    }

    // 使用 @RequestHeader 从请求头中获取数据
    @GetMapping("/header")
    public String getRequestHeader(@RequestHeader("X-Request-ID") String requestId) {
        return "Request ID from Header: " + requestId;
    }

    // 使用 @ModelAttribute 获取请求参数并绑定到对象
    @PostMapping("/modelAttribute")
    public String handleModelAttribute(@ModelAttribute User user) {
        return "User Name: " + user.getName() + ", Age: " + user.getAge();
    }

    // 使用 @RequestParam 获取URL参数
    @GetMapping("/params")
    public String getRequestParam(@RequestParam("name") String name, @RequestParam("age") int age) {
        return "Name: " + name + ", Age: " + age;
    }

    // 使用 @CookieValue 获取Cookie值
    @GetMapping("/cookie")
    public String getCookieValue(@CookieValue("session") String sessionCookie) {
        return "Session Cookie: " + sessionCookie;
    }

    // 使用 @RequestBody 获取请求体中的数据
    @PostMapping("/body")
    public String handleRequestBody(@RequestBody User user) {
        return "User Name from Body: " + user.getName() + ", Age: " + user.getAge();
    }

    static class User {
        private String name;
        private int age;

        // Getters and setters
        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;
        }
    }
}

测试示例(普通)

  1. @PathVariable 测试路径:
GET /api/path/123/profile
  1. @RequestHeader 测试路径:
GET /api/header
请求头中需要包含 X-Request-ID: 12345。
  1. @ModelAttribute 测试路径:
POST /api/modelAttribute
{
    "name": "John Doe",
    "age": 30
}
  1. @RequestParam 测试路径:
GET /api/params?name=John&age=30
  1. @CookieValue 测试路径:
GET /api/cookie
Cookie: session=abc123
  1. @RequestBody 测试路径:
POST /api/body
{
    "name": "Jane Doe",
    "age": 25
}

特殊(传数组)

  1. 使用 @RequestBody 传递JSON数组
    • 如果你使用POST请求并通过请求体传递一个JSON数组,你可以使用@RequestBody注解来接收这个数组。在Spring Boot中,你可以使用HttpEntity或者直接使用@RequestBody来接收数组。
    @RestController
    @RequestMapping("/api")
    public class ListController {
    
        // 使用 @RequestBody 接收JSON数组
        @PostMapping("/list")
        public String handleRequestBodyList(@RequestBody List<User> users) {
            return "Received " + users.size() + " users";
        }
    }
    
    • 测试路径和请求体
    POST /api/list
    [
        {"name": "John Doe", "age": 30},
        {"name": "Jane Doe", "age": 25}
    ]
    
  2. 使用 @RequestParam 传递多个相同参数
    • 如果你使用GET请求并通过URL参数传递多个相同名称的参数,你可以使用@RequestParam注解来接收这些参数,并将其转换为列表。
    @RestController
    @RequestMapping("/api")
    public class ListController {
    
        // 使用 @RequestParam 接收多个相同参数
        @GetMapping("/params")
        public String getRequestParamList(@RequestParam("userId") List<String> userIds) {
            return "Received user IDs: " + Arrays.toString(userIds.toArray());
        }
    }
    
    • 测试路径和参数:
    GET /api/params?userId=1&userId=2&userId=3
    
  3. 使用 @ModelAttribute 传递表单数据
    • 如果你使用POST请求并通过表单数据传递一个列表,你可以使用@ModelAttribute注解来接收这个列表。这通常用于处理表单提交。
    @RestController
    @RequestMapping("/api")
    public class ListController {
    
        // 使用 @ModelAttribute 接收表单数据
        @PostMapping("/form")
        public String handleModelAttribute(@ModelAttribute List<User> users) {
            return "Received " + users.size() + " users";
        }
    }
    
    • 测试路径和请求体:
    POST /api/form
    请求体中包含表单数据(使用application/x-www-form-urlencoded):
    userId=1&userId=2&userId=3
    或者,如果你使用JSON格式的请求体,你需要自定义一个包装类来接收这个列表。
    
  4. 使用自定义包装类
    • 对于复杂的数据结构,你可以创建一个自定义的包装类来接收列表。
    public class UserListWrapper {
        private List<User> users;
    
        // Getters and setters
        public List<User> getUsers() {
            return users;
        }
    
        public void setUsers(List<User> users) {
            this.users = users;
        }
    }
    
    @RestController
    @RequestMapping("/api")
    public class ListController {
    
        // 使用自定义包装类接收JSON数组
        @PostMapping("/custom")
        public String handleCustomList(@RequestBody UserListWrapper wrapper) {
            return "Received " + wrapper.getUsers().size() + " users";
        }
    }
    
    • 测试路径和请求体:
    POST /api/custom
    {
        "users": [
            {"name": "John Doe", "age": 30},
            {"name": "Jane Doe", "age": 25}
        ]
    }