注解验证


  1. 使用方法:

  2.         //1. 全局配置里增加
            @Override
    	public void configInterceptor(Interceptors me) {
    		me.add(new ValidatedInterceptor());
    	}
    	//2. Controller 加入
    	@Validated(field = "username", type = ValidatedType.isNotBlank, errorMessage = "用户名不能为空")
    	@Validated(field = "password", errorMessage = "密码不能为空")
    	@Validated(field = "age",type = ValidatedType.isInteger, errorMessage = "输入的年龄有误")
    	@Validated(field = "email", type = ValidatedType.isEmail, errorMessage = "输入的邮箱有误")
    	public void doLogin(
    			@Para("username") String username,
    			@Para("password") String password,
    			@Para("age") Integer age,
    			@Para("email") String email
    		) {
    		
                    //登陆过程....
    		
    		renderJson(Ret.ok());
    	}
  3. ValidatedType.java  //注解验证类型

  4. package app.interceptor;
    
    public enum ValidatedType {
    	isNotBlank,
    	isEmail,
    	isInteger
    }
  5. Validateds.java //注解

  6. package app.interceptor;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Inherited
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ ElementType.TYPE, ElementType.METHOD })
    public @interface Validateds {
    	Validated[] value();
    }
  7. Validated.java //注解

  8. package app.interceptor;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Repeatable;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Inherited
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ ElementType.TYPE, ElementType.METHOD })
    @Repeatable(Validateds.class)
    
    public @interface Validated {
    
    	String field() default "";
    
    	ValidatedType type() default ValidatedType.isNotBlank;
    
    	String errorMessage() default "";
    
    }
  9. ValidatedInterceptor.java //全局拦截判断

  10. package app.interceptor;
    
    import com.jfinal.aop.Interceptor;
    import com.jfinal.aop.Invocation;
    import com.jfinal.core.Controller;
    import com.jfinal.kit.Kv;
    import com.jfinal.kit.Ret;
    import com.jfinal.kit.StrKit;
    
    public class ValidatedInterceptor implements Interceptor {
    
    	static final String regexInteger = "\\d+";
    	static final String regexEmail = "\\b(^['_A-Za-z0-9-]+(\\.['_A-Za-z0-9-]+)*@([A-Za-z0-9-])+(\\.[A-Za-z0-9-]+)*((\\.[A-Za-z0-9]{2,})|(\\.[A-Za-z0-9]{2,}\\.[A-Za-z0-9]{2,}))$)\\b";
    
    	@Override
    	public void intercept(Invocation inv) {
    		Validateds inputVerifys = getAnnotation(inv);
    		if (inputVerifys == null) {
    			inv.invoke();
    			return;
    		}
    		doVerifys(inv, inputVerifys);
    	}
    
    	private Validateds getAnnotation(Invocation inv) {
    		Validateds inputVerifys = inv.getController().getClass().getAnnotation(Validateds.class);
    		return inputVerifys != null ? inputVerifys : inv.getMethod().getAnnotation(Validateds.class);
    	}
    
    	private void doVerifys(Invocation inv, Validateds inputVerifys) {
    		Controller c = inv.getController();
    		Kv kv = new Kv();
    		if (inputVerifys != null) {
    			for (Validated input : inputVerifys.value()) {
    				if (isValidation(input.type(), c.getPara(input.field()))) {
    					kv.set(input.field(), input.errorMessage());
    				}
    			}
    		}
    		if (!kv.isEmpty()) {
    			c.renderJson(Ret.data(kv).setFail());
    		} else {
    			inv.invoke();
    			return;
    		}
    	}
    
    	private boolean isValidation(ValidatedType type, Object value) {
    		switch (type) {
    		case isNotBlank:
    			return (value == null ? true : StrKit.isBlank(value.toString()));
    		case isInteger:
    			return (value == null ? true : !value.toString().matches(regexInteger));
    		case isEmail:
    			return (value == null ? true : !value.toString().matches(regexEmail));
    		default:
    			return (value == null ? true : StrKit.isBlank(value.toString()));
    		}
    	}
    
    }

       

    代码参照  EnableCORS 写的,   希望@JFinal能细化代码,并收入jfinal jar里面. 方便使用者验证.




评论区

热门分享

扫码入社