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()); } }