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