@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Documented
@Pattern(regexp = "^[\\u4e00-\\u9fa5\\w]+$")
@Constraint(validatedBy = { })
public @interface ChsNamePattern {
@AliasFor(value = "message", annotation = Pattern.class)
String message() default "自定义 message";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
想用这个自定义注解来简化的使用 @Pattern
但是 @validated 校验的时候 message 不会生效。而是会走默认的,大晚上的折腾好久了,好烦。。 是因为 @AliasFor 是 spring 的,校验工具不会去解析??
1
rizon OP 这个问题好难受啊。
我不想每个地方都要写这个 regex 啊。 |
2
feiyuanqiu 2019-03-23 02:12:52 +08:00 1
你想要实现什么效果?校验失败时抛出 @ChsNamePattern 的“自定义 message ”而不是 @Pattern 的 message ?实现这个有两个方法:
1. 使用 @ReportAsSingleViolation 注解 @ReportAsSingleViolation @Pattern(regexp = "^[\\u4e00-\\u9fa5\\w]+$") @Constraint(validatedBy = {}) @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) @Retention(RUNTIME) @Documented public @interface ChsNamePattern {} 2. 使用 @OverridesAttribute 注解 @Pattern(regexp = "^[\\u4e00-\\u9fa5\\w]+$") @Constraint(validatedBy = {}) @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) @Retention(RUNTIME) @Documented public @interface ChsNamePattern { @OverridesAttribute(constraint = Pattern.class, name = "message") String message() default "自定义 message"; } https://beanvalidation.org/1.0/spec/#constraintsdefinitionimplementation-constraintcomposition |
3
feiyuanqiu 2019-03-23 02:20:24 +08:00
|
4
wuzhi1234 2019-03-23 08:28:08 +08:00 via iPhone
还特地为一个正则写个注解,这开发回报比也太低了,还不如直接维护个正则常量类或者枚举
|
5
rizon OP @feiyuanqiu #2 感谢大佬!!!居然还有这种用法,这些冷门知识真的是不好找啊。。
关于问题写的不清楚非常抱歉。 我平常提问的时候,其实都有好好去想和写问题,让问题更加直接和简洁有效。就像你说的,描述目标。 当时提问的时候,是周六好像一两点的时候了,有事着急回家,然后又被这么个问题卡壳了好久,又着急又找不大答案。所以郁闷加急迫之下,就匆匆写了问题。 唉~ |
6
rizon OP @feiyuanqiu #2 大佬阿,还有个问题麻烦问一下。
就是 ValidationMessages.properties 校验模版中文乱码。 我配置了 ValidationMessages.properties,去配置自定义的错误信息模板。使用的是 ut8 格式,但是会乱码,我尝试去按网上说的配置 messagesource 的 bean 对象也没有解决。现在只能把文件内容换成 native 格式的。 |
7
feiyuanqiu 2019-03-25 19:00:47 +08:00
@rizon #6 不能直接写中文,因为 .properties 文件的编码方式是 ISO-8859-1,中文字符需要转换为对应的 Unicode escape 编码。否则读取时就乱码了。可以使用 commons-text 库的一个方法做转换:
String s = "只能为 false"; String escaped = org.apache.commons.text.StringEscapeUtils.escapeJava(s); System.out.println(escaped); 默认的中文消息模版在 org/hibernate/validator/ValidationMessages_zh_CN.properties,可以参考一下它。 "The encoding of a .properties file is ISO-8859-1, also known as Latin-1. All non-Latin-1 characters must be entered by using Unicode escape characters, e.g. \uHHHH where HHHH is a hexadecimal index of the character in the Unicode character set." https://en.wikipedia.org/wiki/.properties#Format |