V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rizon
V2EX  ›  程序员

求助大佬!这个 @AliasFor 为什么不生效??

  •  
  •   rizon ·
    othorizon · 2019-03-23 00:06:50 +08:00 · 3173 次点击
    这是一个创建于 2073 天前的主题,其中的信息可能已经有所发展或是发生改变。
    @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 的,校验工具不会去解析??

    7 条回复    2019-03-25 19:00:47 +08:00
    rizon
        1
    rizon  
    OP
       2019-03-23 00:48:25 +08:00
    这个问题好难受啊。
    我不想每个地方都要写这个 regex 啊。
    feiyuanqiu
        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
    wuzhi1234
        4
    wuzhi1234  
       2019-03-23 08:28:08 +08:00 via iPhone
    还特地为一个正则写个注解,这开发回报比也太低了,还不如直接维护个正则常量类或者枚举
    rizon
        5
    rizon  
    OP
       2019-03-25 11:51:44 +08:00
    @feiyuanqiu #2 感谢大佬!!!居然还有这种用法,这些冷门知识真的是不好找啊。。

    关于问题写的不清楚非常抱歉。
    我平常提问的时候,其实都有好好去想和写问题,让问题更加直接和简洁有效。就像你说的,描述目标。

    当时提问的时候,是周六好像一两点的时候了,有事着急回家,然后又被这么个问题卡壳了好久,又着急又找不大答案。所以郁闷加急迫之下,就匆匆写了问题。 唉~
    rizon
        6
    rizon  
    OP
       2019-03-25 13:26:56 +08:00
    @feiyuanqiu #2 大佬阿,还有个问题麻烦问一下。

    就是 ValidationMessages.properties 校验模版中文乱码。

    我配置了 ValidationMessages.properties,去配置自定义的错误信息模板。使用的是 ut8 格式,但是会乱码,我尝试去按网上说的配置 messagesource 的 bean 对象也没有解决。现在只能把文件内容换成 native 格式的。
    feiyuanqiu
        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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2758 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 09:58 · PVG 17:58 · LAX 01:58 · JFK 04:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.