扩展Validator添加一些自定义的验证报错

代码如下:

public abstract class BaseValidator extends Validator{
    /**
     * 常用正则表达式:匹配非负整数(正整数 + 0)
     */
    public static final String regExp_integer_1 = "^\\d+$";

    /**
     * 常用正则表达式:匹配正整数
     */
    public static final String regExp_integer_2 = "^[0-9]*[1-9][0-9]*$";

    /**
     * 常用正则表达式:匹配非正整数(负整数  + 0)
     */
    public static final String regExp_integer_3 = "^((-\\d+) ?(0+))$";

    /**
     * 常用正则表达式:匹配负整数
     */
    public static final String regExp_integer_4 = "^-[0-9]*[1-9][0-9]*$";

    /**
     * 常用正则表达式:匹配整数
     */
    public static final String regExp_integer_5 = "^-?\\d+$";

    /**
     * 常用正则表达式:匹配非负浮点数(正浮点数 + 0)
     */
    public static final String regExp_float_1 = "^\\d+(\\.\\d+)?$";

    /**
     * 常用正则表达式:匹配正浮点数
     */
    public static final String regExp_float_2 = "^(([0-9]+\\.[0-9]*[1-9][0-9]*) ?([0-9]*[1-9][0-9]*\\.[0-9]+) ?([0-9]*[1-9][0-9]*))$";

    /**
     * 常用正则表达式:匹配非正浮点数(负浮点数 + 0)
     */
    public static final String regExp_float_3 = "^((-\\d+(\\.\\d+)?) ?(0+(\\.0+)?))$";

    /**
     * 常用正则表达式:匹配负浮点数
     */
    public static final String regExp_float_4 = "^(-(([0-9]+\\.[0-9]*[1-9][0-9]*) ?([0-9]*[1-9][0-9]*\\.[0-9]+) ?([0-9]*[1-9][0-9]*)))$";

    /**
     * 常用正则表达式:匹配浮点数
     */
    public static final String regExp_float_5 = "^(-?\\d+)(\\.\\d+)?$";

    /**
     * 常用正则表达式:匹配由26个英文字母组成的字符串
     */
    public static final String regExp_letter_1 = "^[A-Za-z]+$";

    /**
     * 常用正则表达式:匹配由26个英文字母的大写组成的字符串
     */
    public static final String regExp_letter_2 = "^[A-Z]+$";

    /**
     * 常用正则表达式:匹配由26个英文字母的小写组成的字符串
     */
    public static final String regExp_letter_3 = "^[a-z]+$";

    /**
     * 常用正则表达式:匹配由数字和26个英文字母组成的字符串
     */
    public static final String regExp_letter_4 = "^[A-Za-z0-9]+$";

    /**
     * 常用正则表达式:匹配由数字、26个英文字母或者下划线组成的字符串
     */
    public static final String regExp_letter_5 = "^\\w+$";

    /**
     * 常用正则表达式:匹配email地址
     */
    public static final String regExp_email = "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$";

    /**
     * 常用正则表达式:匹配url
     */
    public static final String regExp_url_1 = "^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$";

    /**
     * 常用正则表达式:匹配url
     */
    public static final String regExp_url_2 = "[a-zA-z]+://[^\\s]*";

    /**
     * 常用正则表达式:匹配中文字符
     */
    public static final String regExp_chinese_1 = "[\\u4e00-\\u9fa5]";

    /**
     * 常用正则表达式:匹配双字节字符(包括汉字在内)
     */
    public static final String regExp_chinese_2 = "[^\\x00-\\xff]";

    /**
     * 常用正则表达式:匹配空行
     */
    public static final String regExp_line = "\\n[\\s ? ]*\\r";

    /**
     * 常用正则表达式:匹配HTML标记
     */
    public static final String regExp_html_1 = "/ <(.*)>.* <\\/\\1> ? <(.*) \\/>/";

    /**
     * 常用正则表达式:匹配首尾空格
     */
    public static final String regExp_startEndEmpty = "(^\\s*) ?(\\s*$)";

    /**
     * 常用正则表达式:匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线)
     */
    public static final String regExp_accountNumber = "^[a-zA-Z][a-zA-Z0-9_]{4,15}$";

    /**
     * 常用正则表达式:匹配国内电话号码,匹配形式如 0511-4405222 或 021-87888822
     */
    public static final String regExp_telephone = "\\d{3}-\\d{8} ?\\d{4}-\\d{7}";

    /**
     * 常用正则表达式:腾讯QQ号, 腾讯QQ号从10000开始
     */
    public static final String regExp_qq = "[1-9][0-9]{4,}";

    /**
     * 常用正则表达式:匹配中国邮政编码
     */
    public static final String regExp_postcode = "[1-9]\\d{5}(?!\\d)";

    /**
     * 常用正则表达式:匹配身份证, 中国的身份证为15位或18位
     */
    public static final String regExp_idCard = "\\d{15} ?\\d{18}";

    /**
     * 常用正则表达式:IP
     */
    public static final String regExp_ip = "\\d+\\.\\d+\\.\\d+\\.\\d+";

    /**
     * 常用正则表达式:手机号
     */
    public static final String regExp_mobile = "^0?(13[0-9]|15[012356789]|18[01236789]|14[57])[0-9]{8}$";



    /**
     * 验证手机号
     */
    protected void validateMobile(String field, String errorKey, String errorMessage) {
        validateRegex(field, regExp_mobile, false, errorKey, errorMessage);
    }

    /**
     * 验证邮编
     */
    protected void validatePostcode(String field, String errorKey, String errorMessage) {
        validateRegex(field, regExp_postcode, false, errorKey, errorMessage);
    }

    /**
     * 验证身份证
     */
    protected void validateIdCard(String field, String errorKey, String errorMessage) {
        validateRegex(field, regExp_idCard, false, errorKey, errorMessage);
    }
}

错误信息:

 java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy

at sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:724)

at sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:531)

at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:355)

at sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:286)

at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:120)

at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:72)

at java.lang.reflect.Executable.declaredAnnotations(Executable.java:599)

at java.lang.reflect.Executable.declaredAnnotations(Executable.java:597)

at java.lang.reflect.Executable.getAnnotation(Executable.java:570)

at java.lang.reflect.Method.getAnnotation(Method.java:622)

at com.jfinal.aop.InterceptorManager.doBuild(InterceptorManager.java:83)

at com.jfinal.aop.InterceptorManager.buildControllerActionInterceptor(InterceptorManager.java:75)

at com.jfinal.core.ActionMapping.buildActionMapping(ActionMapping.java:86)

at com.jfinal.core.JFinal.initActionMapping(JFinal.java:102)

at com.jfinal.core.JFinal.init(JFinal.java:66)

at com.jfinal.core.JFinalFilter.init(JFinalFilter.java:49)

at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:279)

at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:260)

at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:105)

at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4700)

at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5340)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)

at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:753)

at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:729)

at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)

at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1696)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)

at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)

at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)

at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:484)

at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:433)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)

at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)

at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)

at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)

at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)

at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)

at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)

at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)

at sun.rmi.transport.Transport$1.run(Transport.java:200)

at sun.rmi.transport.Transport$1.run(Transport.java:197)

at java.security.AccessController.doPrivileged(Native Method)

at sun.rmi.transport.Transport.serviceCall(Transport.java:196)

at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)

at java.security.AccessController.doPrivileged(Native Method)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at java.lang.Thread.run(Thread.java:745)


评论区

JFinal

2017-04-09 20:58

仅给出一个类定义,无法判断原因

EATI001

2017-04-09 21:56

@JFinal 下面就是错误堆栈信息了。

JFinal

2017-04-10 13:47

显然我是在说需要如下的信息量,才有可能存在回答的空间:
1:abstract class BaseValidator 不是引发错误的原因,而是你的具体的某个 Validator 直接引发,但你没贴出这部分代码
2:具体的那个 Validator 怎么用的,里面的代码是什么,无从得知
3:异常信中的信息与 Validator, 甚至与你的 BaseValidator 完全无关,你可以搜索一下这个异常信息,完全不存在 Validator 字样,甚至存在的 jfinal 字样也只有与 aop 相关的两个类
4:异常信中完全没有 cause 信息

提出问题,要换位思考,站在回答者的角度去思考到底提供什么信息量才让对方能理解在问什么,如何回答

因此,本贴中的问题完全没有可回答的空间

EATI001

2017-04-10 15:00

@JFinal
1、LoginValidator.class代码:
public class LoginValidator extends BaseValidator {
@Override
protected void validate(Controller c) {
BaseController cc = (BaseController) c;
if ("GET".equals(c.getRequest().getMethod())) {
return;
}

String actionKey = getActionKey();
setShortCircuit(true);
switch (actionKey) {
case "/login":
validateRequired("username", "userNameMsg", "手机不能为空");
validateMobile("username", "userNameMsg", "手机格式不正确");

validateRequired("password", "passwordMsg", "密码不能为空");
// validateCaptcha("captcha", "captchaMsg", "验证码不正确");
break;
case "/pass":
validateRequired("pass", "passMsg", "请输入密码");
validateRequired("pass1", "pass1Msg", "请输入确认密码");
break;
}

}
validateMobile这个是我扩展的验证方法。
2、调用是这要的:
@Clear
@ActionKey(LOGIN_URL)
@Before({LoginValidator.class})
public void login() {
Ret ret = new Ret();
String returnUrl = getPara(RETURN_URL, "/admin");
if (SecurityUtils.getSubject().isAuthenticated()) {
if (!sl.isEmpty(returnUrl)) {
ret.set("returnUrl", returnUrl).set("isOk", true);
renderJson(ret);
用idea的,启动tomcat就只报上面贴的这个错误,tomcat没有启动成功。

EATI001

2017-04-10 15:08

@JFinal 在idea下做jfinal开发真心不好使,就是以上调用重启tomcat上面贴那个错误信息,我也很无奈啊。

EATI001

2017-04-10 15:13

@JFinal 就一个简单的扩展,从上面的确实没有什么高超东西,但确实就是这么个回事,错误信息不明,如果能有明确的信息我也不用在这发帖求助了。

JFinal

2017-04-10 15:19

根据异常定位到 InterceptorManager.java 文件的第 83 行代码如下:
method.getAnnotation(Before.class)

很显然这行代码是一个极其正确的代码,问题必然是出现在代码之外的地方,从下面几个方法去尝试解决:
1:确定 jdk 的版本,以及是否是 oracle 的 jdk,而非 openjdk
2:如果使用 JFinal.start(...) 启动,确定启动参数在 IDEA 开发环境之下,是否去掉了最后一个参数,也即最后一个 int 参数在 IDEA 之下一定要去掉
3:尝试将 @Before({LoginValidator.class}) 改为 @Before(LoginValidator.class)

无论如何,这个问题必然与 jfinal 无关,因为 method.getAnnotation(Before.class) 这行代码已经使用了五年以上了,从未出过问题

EATI001

2017-04-10 15:20

@JFinal 确定oralce jdk1.8.0.77

EATI001

2017-04-10 15:20

@JFinal 我就想给你远程协助了。^_^

EATI001

2017-04-10 15:28

@JFinal tomcat部署的,在idea搞经常遇上一些莫名奇妙的问题。

EATI001

2017-04-10 15:41

@JFinal 不理了,这类问题,反正也习惯了。

EATI001

2017-04-10 16:06

@JFinal 现在又得了,jdk我也换成最新的1.8.121去了。

热门反馈

扫码入社