在查看项目代码的过程中,看到了有的地方使用的@RequestMapping,有的地方用的@GetMapping或@PostMapping
@RequestMapping 和 @GetMapping @PostMapping 区别
@GetMapping用于将HTTP get请求映射到特定处理程序的方法注解
是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。
@PostMapping用于将HTTP post请求映射到特定处理程序的方法注解
是一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。
查看GetMapping源码
/**
* Annotation for mapping HTTP {@code GET} requests onto specific handler
* methods.
*
* <p>Specifically, {@code @GetMapping} is a <em>composed annotation</em> that
* acts as a shortcut for {@code @RequestMapping(method = RequestMethod.GET)}.
*
*
* @author Sam Brannen
* @since 4.3
* @see PostMapping
* @see PutMapping
* @see DeleteMapping
* @see PatchMapping
* @see RequestMapping
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.GET)
public @interface GetMapping {
/**
* Alias for {@link RequestMapping#name}.
*/
@AliasFor(annotation = RequestMapping.class)
String name() default "";
/**
* Alias for {@link RequestMapping#value}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] value() default {};
/**
* Alias for {@link RequestMapping#path}.
*/
@AliasFor(annotation = RequestMapping.class)
String[] path() default {};
在GetMapping中使用到了RequestMapping注解
扩展
Spring的复杂性不是来自于它处理的对象,而是来自于自身,不断演进发展的Spring会带来时间维度上复杂性,比如SpringMVC以前版本的@RequestMapping,到了新版本被下面新注释替代,相当于增加的选项:
- @GetMapping
- @PostMapping
- @PutMapping
- @DeleteMapping
- @PatchMapping
从命名约定我们可以看到每个注释都是为了处理各自的传入请求方法类型,即@GetMapping用于处理请求方法的GET类型,@ PostMapping用于处理请求方法的POST类型等。
如果我们想使用传统的@RequestMapping注释实现URL处理程序,那么它应该是这样的:
@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
新方法可以简化为:
@GetMapping("/get/{id}")
工作原理
所有上述注释都已在内部注释了@RequestMapping以及方法元素中的相应值。
例如,如果我们查看@GetMapping注释的源代码,我们可以看到它已经通过以下方式使用RequestMethod.GET进行了注释:
@Target({ java.lang.annotation.ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = { RequestMethod.GET })
public @interface GetMapping {
// abstract codes
}
所有其他注释都以相同的方式创建,即@PostMapping使用RequestMethod.POST进行注释,@ PutMapping使用RequestMethod.PUT进行注释等。
使用方式
下面是结合RestController的简单使用:
@RestController
@RequestMapping("users")
public class UserController {
@Autowired
UserService userService;
@GetMapping("/status/check")
public String status()
{
return "working";
}
@GetMapping("/{id}")
public String getUser(@PathVariable String id)
{
return "HTTP Get was called";
}
@PostMapping
public String createUser(@RequestBody UserDetailsRequestModel requestUserDetails)
{
return "HTTP POST was called";
}
@DeleteMapping("/{userId}")
public String deleteUser(@PathVariable String userId)
{
return "HTTP DELETE was called";
}
@PutMapping("/{userId}")
public String updateUser(@PathVariable String userId, @RequestBody UserDetailsRequestModel requestUserDetails)
{
return "HTTP PUT was called";
}
}
下面是使用@Controller的代码:
@Controller
public class HomeController
{
@GetMapping("/")
public String homeInit(Model model) {
return "home";
}
}
在上面的代码中,HomeController类充当请求控制器。它的homeInit()方法将处理所有传入的URI请求"/"。它接受a Model并返回视图名称home。使用配置的视图解析器解析视图名称”home“的页面。
写法对比
@RequestMapping:
@RequestMapping(value = "/workflow",
produces = {"application/json"},
consumes = {"application/json"},
method = RequestMethod.POST)
@PostMapping如下:
@PostMapping(path = "/members", consumes = "application/json", produces = "application/json")
public void addMember(@RequestBody Member member) {
//code
}
所以,一般情况下用@RequestMapping(method = RequestMethod. XXXX)即可。
如果使用method=RequestMethod.POST:只接受post请求,其他的不行,如果接收的不是post请求会405报错