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());
    }
}
相關文章
相關標籤/搜索