Controller中的handler方法参数

原创
2016/03/13 22:59
阅读数 319

        今天继续看Spring MVC中16.3节(Implementing Controllers)的内容。


        由@RequestMapping注解的handler允许的方法参数中,包括Errors和BindingResult,这两个类是Spring的验证框架(validation)中的类。这个参数可以为参数列表中在其之前(紧挨,中间不能有其他Model参数,因为方法签名中可能不止有一个model对象,而Spring会为它们每一个都创建一个BindingResult对象)被@ModelAttribute绑定的model对象返回错误验证信息。

        

        这里提到了@ModelAttribute,此注解可以放在方法上或者方法参数列表中。

        添加在方法上表示此方法的目的是添加一个或多个model属性,它支持和@RequestMapping method一样的参数类型,但是不能直接映射请求。在同一Controller中,@ModelAttribute method会在@RequestMapping method之前被激活。  下面的例子是添加一个和添加多个属性的情况:  

//add one attribute
//the return type of the method is added to the model under the name "account"
//you can customize the name via @ModelAttribute("myAccount")
@ModelAttribute
public Account addAccount(@RequestParam String number){
    return accountManager.findAccount(number);
}

//add multiple attributes
public void populateModel(@RequestParam String number, Model model){
    model.addAttribute(accountManager.findAccount(number));
    // add more...
}

        在添加一个属性的情况下,如果没有明确指定属性名,那么就根据返回对象的类型默认为其指定属性名,如返回对象类型为Account,则属性名为account。


        @ModelAttribute添加在方法参数上

        


        另一个值得注意的是由@RequestBody注解的方法参数,该参数和HTTP request body绑定。将request body转换为方法参数需要借助于HttpMessageConverter(这里提到了MVC namespace,它默认注册了更多的message converters),这个类可以将HTTP request message转换为一个对象,也可将一个对象转换为HTTP response body。


        @RequestBody方法参数能够被@Valid注解,这样它就会被Validator验证。不同于@ModelAttribute参数,@RequestBody的验证错误总是会导致一个MethodArgumentNotValidException,此异常会被DefaultHandlerExceptionResolver处理,并向客户端返回400错误码。


        @ResponseBody和@RequestBody比较像,如果将这个注解放在方法上,表明此方法返回的内容将被直接写进HTTP response body中(不会被放到Model中,也不会被解析成视图名),如:

@RequestMapping(value="/something", method=RequestMethod.PUT)
@ResponseBody
public String helloWorld(){
    return "hello world!"
}

        上面的例子,"hello world!"这段文本会被写到HTTP response stream中。


        从请求中(包括request parameters、path variables、request headers、cookie values等)中提取的String-based值需要转换成他们绑定到的参数所属的类型,如果绑定到的参数不是String,Spring会自动将前面提到的那些值转换为合适的类型,所有的简单类型如int、long、Date等都是被支持的。也可以通过WebDataBinder或者FormattingConversionService进一步定制化这种转换。


展开阅读全文
打赏
1
0 收藏
分享
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部