zhaoyu@home:~$

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文档。