{"id":1203,"date":"2020-07-10T19:00:00","date_gmt":"2020-07-10T10:00:00","guid":{"rendered":"https:\/\/ito-u-oti.com\/?p=1203"},"modified":"2020-07-10T17:00:14","modified_gmt":"2020-07-10T08:00:14","slug":"post-1203","status":"publish","type":"post","link":"https:\/\/ito-u-oti.com\/?p=1203","title":{"rendered":"\u3010Java\u3011\u7279\u5b9a\u306e\u6587\u5b57\u3060\u3051\u3092\u5f3e\u304fCustom Validation\u3092\u4f5c\u308b"},"content":{"rendered":"\n<p>\u6587\u5b57\u3092Unicode\u306b\u5909\u63db\u3057\u3066Enum\u306b\u6301\u305f\u305b\u3066\u3044\u308b\u5bfe\u8c61\u6587\u5b57\u306eUnicode\u3068\u6bd4\u3079\u3001\u4e00\u81f4\u3057\u3066\u3044\u305f\u3089Validation\u30a8\u30e9\u30fc\u306b\u3059\u308b\u3068\u3044\u3046\u81ea\u4f5cValid\u7528Annotation\u3092\u4f5c\u308a\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u4f8b\u3067\u306f\u3001\u300c<strong>\u9ad9<\/strong>\u300d\uff08\u306f\u3057\u3054\u9ad8\uff09\u304c\u6587\u5b57\u5217\u306b\u542b\u307e\u308c\u3066\u3044\u305f\u5834\u5408\u306b\u3001Validation\u30a8\u30e9\u30fc\u3068\u3057\u3066\u5f3e\u3044\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3061\u306a\u307f\u306b\u3001\u3053\u306e\u300c<strong>\u9ad9<\/strong>\u300d\u306fIBM\u62e1\u5f35\u6f22\u5b57\u3067\u3059\u3002<\/p>\n\n\n\n<h2 id=\"outline__1\" class=\"wp-block-heading\">\u5b9f\u88c5<\/h2>\n\n\n\n<h3 id=\"outline__1_1\" class=\"wp-block-heading\">SpecificCharValid.java<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\n\/**\n * \u6587\u5b57\u5217\u306e\u4e2d\u306b\u3001\u7279\u5b9a\u306e\u6587\u5b57\u304c\u542b\u307e\u308c\u3066\u3044\u305f\u5834\u5408\u306f\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30a8\u30e9\u30fc\u3092\u8fd4\u3059Annotation &lt;br&gt;\n * \u3069\u306e\u6587\u5b57\u304c\u5bfe\u8c61\u3068\u306a\u308b\u304b\u306f{@link SpecificCharEnum}\u53c2\u7167\n *\/\n@Documented\n@Constraint(validatedBy = {SpecificCharValidator.class})\n@Target({ElementType.FIELD})\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface SpecificCharValid {\n\n    String message() default &quot;The characters that cannot be used are included.&quot;;\n    Class&lt;?&gt;&#x5B;] groups() default {};\n    Class&lt;? extends Payload&gt;&#x5B;] payload() default {};\n\n    @Target({ElementType.FIELD})\n    @Retention(RetentionPolicy.RUNTIME)\n    @Documented\n    @interface List {\n        SpecificCharValid&#x5B;] value();\n    }\n}\n<\/pre><\/div>\n\n\n<p>\u3053\u308c\u3067\u3001<code>@SpecificCharValid<\/code>\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u3068\u3057\u3066\u3001\u30d5\u30a3\u30fc\u30eb\u30c9\u306b\u9069\u7528\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p><code>@Target({ElementType.FIELD})<\/code>\u3067\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u306b\u9069\u7528\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3053\u3053\u3067\u306f\u3001\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u3068\u3057\u3066\u5ba3\u8a00\u3059\u308b\u6587\u5b57\u5217\u3092\u8a2d\u5b9a\u3059\u308b\u7a0b\u5ea6\u306a\u8a18\u8ff0\u3067\u3059\u3002<br>\u5b9f\u969b\u306e\u51e6\u7406\u306f\u6b21\u306e\u30af\u30e9\u30b9\u3067\u884c\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h3 id=\"outline__1_2\" class=\"wp-block-heading\">SpecificCharValidator.java<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\n@Slf4j\npublic class SpecificCharValidator implements ConstraintValidator&lt;SpecificCharValid, String&gt; {\n\n    @Override\n    public void initialize(SpecificCharValid constraintAnnotation) {\n    }\n\n    @Override\n    public boolean isValid(String value, ConstraintValidatorContext context) {\n        if (value == null) {\n            return true;\n        }\n\n        char&#x5B;] chars = value.toCharArray();\n        for (char c : chars) {\n            String unicodeStr = Integer.toHexString(c);\n            if (SpecificCharEnum.isSpecificChar(unicodeStr)) {\n                String targetStr = ((ConstraintValidatorContextImpl) context)\n                        .getConstraintViolationCreationContexts().get(0).getPath().toString();\n                log.warn(&quot;\u691c\u77e5\u5bfe\u8c61\u306e\u6587\u5b57\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002\u5bfe\u8c61\u9805\u76ee\uff1a{} \u5024\uff1a\u300c{}\u300d&quot;, targetStr, value);\n                return false;\n            }\n        }\n        return true;\n    }\n}\n<\/pre><\/div>\n\n\n<p><code>@SpecificCharValid<\/code>\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u88c5\u30af\u30e9\u30b9\u3067\u3059\u3002<\/p>\n\n\n\n<p>ConstraintValidator\u3092implements\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>isValid()\u3092Override\u3057\u3066\u3044\u3066\u3001true\u306a\u3089\u30a8\u30e9\u30fc\u7121\u3057\u3001false\u306a\u3089\u30a8\u30e9\u30fc\u6709\u308a\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>Enum\u304c\u6301\u3063\u3066\u3044\u308bUnicode\u3068\u3001\u4e0e\u3048\u3089\u308c\u305f\u6587\u5b57\u5217\u306b\u542b\u307e\u308c\u308b\u6587\u5b57\u306eUnicode\u3092\u4e00\u3064\u305a\u3064\u691c\u8a3c\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u691c\u8a3c\u5bfe\u8c61\u306e\u6587\u5b57\u5217\u306f\u5f15\u6570\u306evalue\u3068\u3057\u3066\u305d\u306e\u307e\u307e\u53d7\u3051\u53d6\u308b\u306e\u3067\u3059\u304c\u3001\u300c\u305d\u306evalue\u304c\u3069\u3053\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u306b\u5165\u3063\u3066\u3044\u305f\u306e\u304b\u300d\u3068\u3044\u3046\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u60c5\u5831\u306fConstraintValidatorContext\u306b\u683c\u7d0d\u3055\u308c\u3066\u304a\u308a\u3001\u4e0a\u306e\u5b9f\u88c5\u306e\u3088\u3046\u306bConstraintValidatorContextImpl\u306b\u30ad\u30e3\u30b9\u30c8\u3059\u308b\u3053\u3068\u3067\u53d6\u308a\u51fa\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4eca\u56de\u306f\u3001\u30a8\u30e9\u30fc\u3068\u306a\u3063\u305f\u6642\u306b\u30d5\u30a3\u30fc\u30eb\u30c9\u540d\u3082\u4e00\u7dd2\u306b\u30ed\u30b0\u3067\u51fa\u529b\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<h3 id=\"outline__1_3\" class=\"wp-block-heading\">SpecificCharEnum.java<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\n\/**\n * \u691c\u77e5\u5bfe\u8c61\u6587\u5b57\u306eEnum\n *\/\n@Slf4j\npublic enum SpecificCharEnum {\n\n    SPECIFIC_CHAR_ENUM_1(&quot;\u9ad9&quot;,&quot;9ad9&quot;);\n\n\n    private final String specificChar;\n    private final String unicodeStr;\n\n    SpecificCharEnum(String specificChar, String unicodeStr) {\n        this.specificChar = specificChar;\n        this.unicodeStr = unicodeStr;\n    }\n\n    public String getUnicodeStr() {\n        return unicodeStr;\n    }\n\n    public String getSpecificChar() {\n        return specificChar;\n    }\n\n    public static boolean isSpecificChar(String targetUnicode){\n        for (SpecificCharEnum specificCharEnum: SpecificCharEnum.values()){\n            if (specificCharEnum.getUnicodeStr().equals(targetUnicode)){\n                log.warn(&quot;\u691c\u77e5\u5bfe\u8c61\u306e\u6587\u5b57\u3092\u691c\u77e5\u3057\u307e\u3057\u305f\u3002\u5bfe\u8c61\uff1a{}&quot;,specificCharEnum.getSpecificChar());\n                return true;\n            }\n        }\n        return false;\n    }\n}\n<\/pre><\/div>\n\n\n<p>\u30a8\u30e9\u30fc\u3067\u5f3e\u304f\u5bfe\u8c61\u3068\u306a\u308b\u6587\u5b57\u3092Enum\u3067\u6301\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>Unicode\u60c5\u5831\u3092\u6301\u3063\u3066\u304a\u308a\u3001isSpecificChar\u3067\u4e0e\u3048\u3089\u308c\u305fUnicode\u3068\u5404Enum\u306eUnicode\u3092\u6bd4\u8f03\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h2 id=\"outline__2\" class=\"wp-block-heading\">\u30c6\u30b9\u30c8<\/h2>\n\n\n\n<h3 id=\"outline__2_1\" class=\"wp-block-heading\">SpecificCharValidatorTests.java<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\nclass SpecificCharValidatorTests {\n\n    private Validator validator;\n\n    @BeforeEach\n    void setUp() {\n        validator = Validation.buildDefaultValidatorFactory().getValidator();\n    }\n\n    @MethodSource(&quot;testStrList&quot;)\n    @ParameterizedTest\n    void specificCharTest(String targetStr, boolean expect) {\n        TestBean testBean = new TestBean(targetStr);\n        Set&lt;ConstraintViolation&lt;TestBean&gt;&gt; violations = validator.validate(testBean);\n        assertThat(violations.isEmpty()).isEqualTo(expect);\n    }\n\n    static Stream&lt;Arguments&gt; testStrList() {\n        return Stream.of(\n                Arguments.arguments(&quot;&quot;, true),\n                Arguments.arguments(null, true),\n                Arguments.arguments(&quot;\u590f\u304c\u8fd1\u3065\u304d\u592a\u5e73\u6d0b\u9ad8\u6c17\u5727\u304c\u52e2\u529b\u3092\u5897\u3059\u3088\u3046\u306b\u306a\u308b\u3068&quot;, true),\n                Arguments.arguments(&quot;\u590f\u304c\u8fd1\u3065\u304d\u592a\u5e73\u6d0b\u9ad9\u6c17\u5727\u304c\u52e2\u529b\u3092\u5897\u3059\u3088\u3046\u306b\u306a\u308b\u3068&quot;, false),\n                Arguments.arguments(&quot;\u9ad9\u7b49\u5b66\u6821&quot;, false),\n                Arguments.arguments(&quot;\u9ad8\u7b49\u5b66\u6821&quot;, true)\n        );\n    }\n\n    private static class TestBean {\n        @SpecificCharValid\n        private String targetStr;\n\n        TestBean(String targetStr) {\n            this.targetStr = targetStr;\n        }\n    }\n}\n<\/pre><\/div>\n\n\n<p>\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30a8\u30e9\u30fc\u306b\u5f15\u3063\u639b\u304b\u3063\u305f\u6642\u306e\u30ed\u30b0\u3068\u3057\u3066\u306f\u3053\u3093\u306a\u611f\u3058\u306b\u51fa\u307e\u3059\u3002<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n16:14:27.851 &#x5B;main] WARN com.example.demo.validator.SpecificCharEnum - \u5236\u5fa1\u5bfe\u8c61\u306e\u6587\u5b57\u3092\u691c\u77e5\u3057\u307e\u3057\u305f\u3002\u5bfe\u8c61\uff1a\u9ad9\n16:14:27.851 &#x5B;main] WARN com.example.demo.validator.SpecificCharValidator - \u691c\u77e5\u5bfe\u8c61\u306e\u6587\u5b57\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002\u5bfe\u8c61\u9805\u76ee\uff1atargetStr \u5024\uff1a\u300c\u9ad9\u7b49\u5b66\u6821\u300d\n<\/pre><\/div>\n\n\n<h2 id=\"outline__3\" class=\"wp-block-heading\">\u305d\u306e\u4ed6<\/h2>\n\n\n\n<h3 id=\"outline__3_1\" class=\"wp-block-heading\">\u6587\u5b57\u306eUnicode\u3092\u63a2\u3059\u3068\u304d\u306b\u53c2\u8003\u306b\u306a\u308b\u30b5\u30a4\u30c8<\/h3>\n\n\n\n<p><a href=\"https:\/\/0g0.org\/\">0g0.org<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/glyphwiki.org\/wiki\/\">\u30b0\u30ea\u30d5\u30a6\u30a3\u30ad<\/a><\/p>\n\n\n\n<h3 id=\"outline__3_2\" class=\"wp-block-heading\">\u30d7\u30ed\u30b0\u30e9\u30e0\u66f8\u3044\u3066\u51fa\u529b\u3057\u3066\u3082\u3089\u3046<\/h3>\n\n\n\n<p>\u307e\u305f\u3001\u5bfe\u8c61\u306e\u6587\u5b57\u304c\u5206\u304b\u3063\u3066\u3044\u308b\u306e\u3067\u3042\u308c\u3070\u30d7\u30ed\u30b0\u30e9\u30e0\u3067Unicode\u3092\u51fa\u529b\u3057\u3066\u3057\u307e\u3046\u306e\u3082\u30a2\u30ea\u3002<\/p>\n\n\n\n<p>\u4e0a\u306eEnum\u306b\u8ffd\u52a0\u3059\u308b\u60f3\u5b9a\u3067Unicode\u3092\u51fa\u529b\u3059\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u66f8\u3044\u3066\u307f\u308b\u3002<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; title: ; notranslate\" title=\"\">\n    @Disabled\n    @Test\n    void outputUnicode(){\n        \/\/\u691c\u77e5\u5bfe\u8c61\u306b\u3057\u305f\u3044\u6587\u5b57\u3092List\u306b\u8ffd\u52a0\u3059\u308b\u3002\n        List&lt;String&gt; strList = List.of(&quot;\u9ad9&quot;, &quot;\u3042&quot;, &quot;\u3044&quot;, &quot;\u2460&quot;);\n\n        for(int i=0;i&lt;strList.size(); i++){\n            char&#x5B;] charArray = strList.get(i).toCharArray();\n            for (char c: charArray){\n                System.out.println(&quot;SPECIFIC_CHAR_ENUM_&quot;+\n                        (i+1)+&quot;(\\&quot;&quot;+strList.get(i)+&quot;\\&quot;,\\&quot;&quot;\n                        +Integer.toHexString(c)+&quot;\\&quot;),&quot;);\n            }\n        }\n    }\n<\/pre><\/div>\n\n\n<p>\u51fa\u529b\u7d50\u679c<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nSPECIFIC_CHAR_ENUM_1(&quot;\u9ad9&quot;,&quot;9ad9&quot;),\nSPECIFIC_CHAR_ENUM_2(&quot;\u3042&quot;,&quot;3042&quot;),\nSPECIFIC_CHAR_ENUM_3(&quot;\u3044&quot;,&quot;3044&quot;),\nSPECIFIC_CHAR_ENUM_4(&quot;\u2460&quot;,&quot;2460&quot;),\n\nProcess finished with exit code 0\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>\u6587\u5b57\u3092Unicode\u306b\u5909\u63db\u3057\u3066Enum\u306b\u6301\u305f\u305b\u3066\u3044\u308b\u5bfe\u8c61\u6587\u5b57\u306eUnicode\u3068\u6bd4\u3079\u3001\u4e00\u81f4\u3057\u3066\u3044\u305f\u3089V [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":257,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[242,96,278,277],"class_list":["post-1203","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programing","tag-annotation","tag-java","tag-unicode","tag-validation"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/ito-u-oti.com\/index.php?rest_route=\/wp\/v2\/posts\/1203","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ito-u-oti.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ito-u-oti.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ito-u-oti.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ito-u-oti.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1203"}],"version-history":[{"count":2,"href":"https:\/\/ito-u-oti.com\/index.php?rest_route=\/wp\/v2\/posts\/1203\/revisions"}],"predecessor-version":[{"id":1205,"href":"https:\/\/ito-u-oti.com\/index.php?rest_route=\/wp\/v2\/posts\/1203\/revisions\/1205"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ito-u-oti.com\/index.php?rest_route=\/wp\/v2\/media\/257"}],"wp:attachment":[{"href":"https:\/\/ito-u-oti.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1203"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ito-u-oti.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1203"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ito-u-oti.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1203"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}