Jfinal实战:自定义方法级别的Validator

Jfinal官方提供的validator通常用来对controller中某一方法进行条件验证,若是须要对controller
中多个方法进行不一样条件的验证,则须要些多个validator文件,那么有没有办法将同一个contrler中方法的
validate方法写到同一个validator文件中呢,答案固然是yes,咱们能够经过自定义注解来解决这个问题。
  • 一、自定义方法级别的注解json

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MethodValidator {dom

    /**
     * 验证器方法
     * @return
     */
    String name();

    }ui

  • 二、自定义BaseValidatorthis

    public abstract class BaseValidator extends Validator {debug

    protected void validate(Controller controller) {
        Method method=getActionMethod();
        if (method.isAnnotationPresent(MethodValidator.class)) {
            String name = method.getAnnotation(MethodValidator.class).name();
            for(Method me:this.getClass().getMethods())
            {
                if (me.getName().equals(name)) {
                    try {
                        me.invoke(this,controller);
                    } catch (IllegalAccessException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IllegalArgumentException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    break;
                }
            }
        }
    }

    }code

三、例子validatorget

public class Area2Validator  extends BaseValidator {

    public void validate2(Controller controller)
    {
        validateRequiredString("bArea.id", "parendIdMsg", "父级不可为空!validate2");
    }

    public void validate3(Controller controller)
    {
        validateRequiredString("bArea.id", "parendIdMsg", "父级不可为空!validate3");
    }

    protected void handleError(Controller controller) {
        controller.keepModel(Area2.class);
        RespBody respBody= new RespBody();
        respBody.setSuccess(false);
        controller.setAttr("json", respBody);
        controller.renderJson();
    }
}

四、例子controllerio

@Before(Area2Validator.class)
public class Area2Controller extends BaseController{
    protected static final Logger log = LoggerFactory.getLogger(Area2Controller.class);
    
    @MethodValidator(name="validate2")
    public void test2() {
        log.debug("modify"+new Random().nextDouble());
    }
    
    @MethodValidator(name="validate3")
    public void test3() {
        log.debug("delete"+new Random().nextDouble());
    }
}
相关文章
相关标签/搜索