坚信科学,分享技术

>>>尝试更加利于阅读的2014版科学院,以后都在新版上写。

rose手册第三章五节:controller层:统一的参数验证办法

rose

3.5.1 用来做什么

----------------
* 我们把的参数验证办法叫ParamValidator
* 一般来说,像比如说验证http传来的参数是不是为空呀啥的(发挥你的想象力)。
* 好处在于不用再重复地写if else

3.5.2 怎么用
------------
* 来看一个例子,验证用户的参数不可为空(灰常灰常的实用):

  1. public class NotBlankParamValidator implements ParamValidator {  
  2.   
  3.     @Override  
  4.     public boolean supports(ParamMetaData metaData) {  
  5.         return metaData.getAnnotation(NotBlank.class) != null;  
  6.     }  
  7.   
  8.     @Override  
  9.     public Object validate(ParamMetaData metaData, Invocation inv, Object target, Errors errors) {  
  10.         String paramName = metaData.getParamName();  
  11.         String value = inv.getParameter(paramName);  
  12.         if (StringUtils.isBlank(value)) {  
  13.             return "@参数不能为空";  
  14.         }  
  15.         return null;  
  16.     }  
  17. }  

解读:

* 放到controllers下
* 实现ParamValidator
* 实现supports方法,这个方法用来做判断是否要验证当前得到的http参数,一般都用个注解来判断比较文艺
* 实现validate方法,这里是主要逻辑
* metaData里放的是参数的原型
* inv是rose的基础调用
* target是这个参数的最后解析结果,参看上一节里提到的东西
* errors是这个参数解析时出来的错误
* NotBlank是一个自己定义的annotation

3.5.3 使用时action长什么样?
----------------------
* 下面的代码是action中使用时长的样子:

  1. @Get("/notBlank")  
  2. public String notBlank(@NotBlank @Param("messages") String messages) throws Exception {  
  3.     return "@hello world";  
  4. }  

解读:
* 当遇到NotBlank注解的参数时,会自动执行参数判断
* 如果messages为空,则会得到“参数不能为空”的返回

文中所提及代码均在 https://github.com/XiaoMi/rose/tree/master/rose-example 提供。
文档持续修改版本在 https://github.com/XiaoMi/rose/tree/master/chapter_3_5


原创文章如转载,请注明:转载自五四陈科学院[http://www.54chen.com]
本文链接: http://www.54chen.com/life/rose-3-5.html

This entry was posted in 未分类. Bookmark the permalink.

17 Responses to “rose手册第三章五节:controller层:统一的参数验证办法”

  1. test 说:

    怎么做Bean的验证,怎么根据参数做个性化的提示呢?

    • 54chen 说:

      很容易,如果你需要验证一个Bean,那么你需要做的就是先按上一节里的内容,提供一个beanResolver,然后使用此节的例子,去验证这个bean。至于“个性化的提示”没有太明白,在这节里的返回,是和action里的返回规则一样的,你也可以返回一个view的位置,甚至json、xml等,应该足够多样化。

  2. todd 说:

    NotBlank.java的接口文件,是不是要和使用@NotBlank的Controller文件放在统一package下?

  3. 屈世超 说:

    有一个问题,求教。
    在对参数进行验证时,如果传入的字符串格式如下:“abc,def,ghi”,controller中参数默认解析成String [],这个过程是由Rose自动完成的,如果我想对字符串中逗号分隔的每个部分进行检验,该怎么实现呢?

  4. xiaohuo 说:

    您好,陈老师,想请教多个参数验证器如(@IsSafe @NotBlank @Param("name") Sring name)这种情况为啥只有后面的@NotBlank生效呢?不能够同时都生效么(对应的Validator都已正确实现,单个使用都是ok的)?有同时生效的办法么?

Leave a Reply