spring传参注解
springMVC 传参常用的注解说明
在springMVC的Controller中常用到@RequestParam,@RequestBody,@ResponseBody和@PathVariable。
RequestParam
RequestParam注解通过名称获取一个请求参数,类似于request.getParameter(),如果方法的参数类型不是String,会自动进行格式转换,如果被注解的参数是一个Map(String, String) 或者 MultiValueMap(String, String),会将所有的请求参数放入map中。
public Uer getUser(@RequestParam("id") Integer Id){
}
RequestBody
RequestBody将request请求的整个body转换为对象。XHR(XMLHttpRequest)不允许get生成body,所以只有Post请求才会有request body,body的格式有form,json,xml等。不能和RequestParam混合使用。如下:
public void updateUser(@RequestBody User user){
}
RequestBody通过HttpMessageConverter将request body转换为对象。
ResponseBody
和RequestBody相似,用于将一个对象转换成json字符串并写入response中。
public @responseBody User getUser(Integer Id){
returnnew User("zhangsan")
}
PathVariable
转换一个请求路径中的变量,如:
@RequestMapping(path = "/{day}", method = RequestMethod.GET)
public Map<String, Appointment> getForDay(@PathVariable @DateTimeFormat(iso=ISO.DATE) Date day, Model model) {
return appointmentBook.getAppointmentsForDay(day);
}
ControllerAdvice
ControllerAdvice字面意思是控制器通知,是一种AOP,可以理解为对Controller的切面。Spring内置对其各个逻辑的织入方式进行了内置支持。 可以结合@ExceptionHandler,@InitBinder, @ModelAttribute使用。
@ExceptionHandler
ExceptionHandler的作用主要在于处理Controller抛出的异常。如处理运行时异常。
@ControllerAdvice(basePackages = "mvc")
public class SpringControllerAdvice {
@ExceptionHandler(RuntimeException.class)
public ModelAndView runtimeException(RuntimeException e) {
e.printStackTrace();
return new ModelAndView("error");
}
}
@InitBinder
@InitBinder主要作用是绑定一些自定义的参数,如对传入的Date字符串进行处理。
@ControllerAdvice(basePackages = "mvc")
public class SpringControllerAdvice {
@InitBinder
public void globalInitBinder(WebDataBinder binder) {
binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
}
}
@ModelAttribute
ModelAttribute用于访问Model,Model结合JSP显示到前台页面。在json交互中不常使用。可以用在方法前和方法参数前。
- 用在方法前
用在方法前时,会在每个Controller中的每个方法执行前执行。
@ControllerAdvice(basePackages = "mvc")
public class SpringControllerAdvice {
@ModelAttribute(value = "message")
public String globalModelAttribute() {
return "this is from model attribute";
}
}
上面的代码在Model中添加了message的属性。
- 用于方法参数前
用于方法前,用于获取model的属性。
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/detail", method = RequestMethod.GET)
public ModelAndView detail(@RequestParam("id") long id,
@ModelAttribute("message") String message) {
System.out.println(message);
ModelAndView view = new ModelAndView("user");
User user = userService.detail(id);
view.addObject("user", user);
return view;
}
}
上面detail的方法中的message便是在前面ControllerAdvice中设置的message。
ControllerAdvice的作用范围
默认情况下,什么参数都不指定,它的作用范围是所有Controller。ControllerAdvice提供了一些可以缩小它的处理范围的参数。
- value:数组类型,用来指定可以作用的基包,即将对指定的包下面的Controller及其子包下面的Controller起作用。
@ControllerAdvice(value="com.elim.app.mvc.controller")
- basePackages:数组类型,等价于value。
@ControllerAdvice(basePackages="com.elim.app.mvc.controller")
- basePackageClasses:数组类型,以指定的Class所在的包及其子包为准。
@ControllerAdvice(basePackageClasses=com.elim.app.mvc.controller.Package.class)
- assignableTypes:数组类型,用来指定具体的Controller类型,它可以是一个共同的接口或父类等。
@ControllerAdvice(assignableTypes=FooController.class)
- annotations:数组类型,用来指定Class上拥有指定的注解的Controller。
@ControllerAdvice(annotations=RestController.class)
- 可以指定多种形式的作用范围,使用逗号隔开。
@ControllerAdvice(assignableTypes=FooController.class, basePackages="com.elim.app.mvc.controller")
其他注解参考spring文档。