{"id":8706,"date":"2022-11-23T17:00:58","date_gmt":"2022-11-23T09:00:58","guid":{"rendered":"http:\/\/123.57.164.21\/?p=8706"},"modified":"2022-11-23T20:45:31","modified_gmt":"2022-11-23T12:45:31","slug":"validate-%e6%88%96-valid-%e6%b3%a8%e8%a7%a3%e8%bf%9b%e8%a1%8c%e6%95%b0%e6%8d%ae%e6%a0%a1%e9%aa%8c","status":"publish","type":"post","link":"https:\/\/92it.top\/?p=8706","title":{"rendered":"@validate \u6216 @valid \u6ce8\u89e3\u8fdb\u884c\u6570\u636e\u6821\u9a8c"},"content":{"rendered":"\n<p>\u6211\u4eec\u5728\u5bf9\u5916\u63d0\u4f9b\u63a5\u53e3\u7684\u65f6\u5019\uff0c\u4e3a\u4e86\u63d0\u9ad8\u5b89\u5168\u6027\uff0c\u6211\u4eec\u9700\u8981\u5728\u540e\u7aef\u505a\u6570\u636e\u7684\u6821\u9a8c\u3002\u5b9e\u9645\u4e0a\uff0cJava \u65e9\u5728 2009 \u5e74\u5c31\u63d0\u51fa\u4e86 Bean Validation \u89c4\u8303\uff0c\u8be5\u89c4\u8303\u5b9a\u4e49\u7684\u662f\u4e00\u4e2a\u8fd0\u884c\u65f6\u7684\u6570\u636e\u9a8c\u8bc1\u6846\u67b6\uff0c\u5728\u9a8c\u8bc1\u4e4b\u540e\u9a8c\u8bc1\u7684\u9519\u8bef\u4fe1\u606f\u4f1a\u88ab\u9a6c\u4e0a\u8fd4\u56de\u3002\u5e76\u4e14\u5df2\u7ecf\u5386\u7ecf JSR303\u3001JSR349\u3001JSR380 \u4e09\u6b21\u6807\u51c6\u7684\u7f6e\u9876\uff0c\u53d1\u5c55\u5230\u4e86 2.0 \u3002\u4e0b\u9762\u5373\u5c06\u8981\u4ecb\u7ecd\u7684\u662f\u8be5\u6570\u636e\u9a8c\u8bc1\u7684\u89c4\u8303\uff0c\u4ee5\u53ca\u76f8\u5e94\u7684\u6280\u672f\u6846\u67b6\u65e5\u5e38\u4f7f\u7528\u3002<\/p>\n\n\n\n<p><strong>\uff11\u3001JSR\u89c4\u8303\u63d0\u6848<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>JSR\uff1aJava Specification Requests\u7684\u7f29\u5199\uff0c\u610f\u601d\u662fJava \u89c4\u8303\u63d0\u6848\u3002\u662f\u6307\u5411JCP(Java Community Process)\u63d0\u51fa\u65b0\u589e\u4e00\u4e2a\u6807\u51c6\u5316\u6280\u672f\u89c4\u8303\u7684\u6b63\u5f0f\u8bf7\u6c42\u3002\u4efb\u4f55\u4eba\u90fd\u53ef\u4ee5\u63d0\u4ea4JSR\uff0c\u4ee5\u5411Java\u5e73\u53f0\u589e\u6dfb\u65b0\u7684API\u548c\u670d\u52a1\uff0cJSR\u5df2\u6210\u4e3aJava\u754c\u7684\u4e00\u4e2a\u91cd\u8981\u6807\u51c6\u3002<br>\u672c\u6587\u4ecb\u7ecd\u7684Bean Validation \u5c31\u662f\u51fa\u81eaJSR303\uff0cJSR349\uff0c\u4ee5\u53caJSR380 \u89c4\u8303\u63d0\u6848\u3002\u8be5\u89c4\u8303\u4eceJSR 303 \u53d1\u5c55\u5230 JSR 380\uff0c\u76ee\u524d\u6700\u65b0\u89c4\u8303\u662fBean Validation 2.0\u3002<br>\u76f8\u4fe1\u6709\u5c0f\u4f19\u4f34\u60f3\u53bb\u770b\u4e0b\u5230\u5e95\u662f\u4e2a\u5565\u3002\u89c4\u8303\u63d0\u6848\u5730\u5740\uff1a<a rel=\"noreferrer noopener\" href=\"https:\/\/jcp.org\/en\/jsr\/summary?id=bean+validation\" target=\"_blank\">https:\/\/jcp.org\/en\/jsr\/summary?id=bean+validation<\/a><\/p>\n\n\n\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u89c4\u8303\u63d0\u6848\u53ea\u662f\u63d0\u4f9b\u4e86\u89c4\u8303\uff0c\u5e76\u6ca1\u6709\u63d0\u4f9b\u5177\u4f53\u7684\u5b9e\u73b0\u3002\u5177\u4f53\u5b9e\u73b0\u6846\u67b6\u6709\u9ed8\u8ba4\u7684javax.validation.api\u7b49\u3002<\/p>\n\n\n\n<p><strong>\uff12\u3001JSR303\u5b9a\u4e49\u7684\u6821\u9a8c\u7c7b\u578b<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/123.57.164.21\/wp-content\/uploads\/2022\/11\/\u56fe\u7247-274.png\" alt=\"\" class=\"wp-image-8707\" width=\"442\" height=\"559\" srcset=\"https:\/\/92it.top\/wp-content\/uploads\/2022\/11\/\u56fe\u7247-274.png 792w, https:\/\/92it.top\/wp-content\/uploads\/2022\/11\/\u56fe\u7247-274-237x300.png 237w, https:\/\/92it.top\/wp-content\/uploads\/2022\/11\/\u56fe\u7247-274-768x972.png 768w, https:\/\/92it.top\/wp-content\/uploads\/2022\/11\/\u56fe\u7247-274-230x291.png 230w, https:\/\/92it.top\/wp-content\/uploads\/2022\/11\/\u56fe\u7247-274-350x443.png 350w, https:\/\/92it.top\/wp-content\/uploads\/2022\/11\/\u56fe\u7247-274-480x607.png 480w\" sizes=\"(max-width: 442px) 100vw, 442px\" \/><\/figure><\/div>\n\n\n\n<p><strong>\uff13\u3001@Valid\u548c@Validated\u7684\u533a\u522b<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<ul><li>@Valid\u6ce8\u89e3\u662fjavax\u63d0\u4f9b\u7684\uff0c\u9075\u5faa\u6807\u51c6 <strong>JSR-303<\/strong> \u89c4\u8303\uff0c\u6240\u5c5e\u5305\u4e3a\uff1a <strong>javax.validation.Valid<\/strong> \u914d\u5408BindingResult\u53ef\u4ee5\u76f4\u63a5\u63d0\u4f9b\u53c2\u6570\u9a8c\u8bc1\u7ed3\u679c\u3002<\/li><\/ul>\n\n\n\n<ul><li>@Validated\u662f@Valid\u7684\u4e00\u6b21\u5c01\u88c5\uff0c\u662fSpring\u63d0\u4f9b\u7684\u6821\u9a8c\u673a\u5236\u4f7f\u7528\uff0c\u9075\u5faa <strong>Spring\u2019s JSR-303<\/strong> \u89c4\u8303\uff08\u662f\u6807\u51c6 <strong>JSR-303<\/strong> \u7684\u4e00\u4e2a\u53d8\u79cd\uff09\uff0c\u6240\u5c5e\u5305\u4e3a\uff1a <strong>org.springframework.validation.annotation.Validated<\/strong><\/li><\/ul>\n\n\n\n<p>@Validation\u5bf9@Valid\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5728\u57fa\u672c\u4f7f\u7528\u4e0a\u5e76\u6ca1\u6709\u533a\u522b\uff0c\u4f46\u5728\u5206\u7ec4\u3001\u6ce8\u89e3\u4f4d\u7f6e\u3001\u5d4c\u5957\u9a8c\u8bc1\u7b49\u529f\u80fd\u4e0a\u6709\u6240\u4e0d\u540c\uff0c\u8fd9\u91cc\u4e3b\u8981\u5c31\u8fd9\u51e0\u79cd\u60c5\u51b5\u8fdb\u884c\u8bf4\u660e\u3002<\/p>\n\n\n\n<p><strong>\uff13.1\u3001\u6ce8\u89e3\u4f4d\u7f6e<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>@Validated\uff1a\u53ef\u4ee5\u7528\u5728\u7c7b\u578b\u3001\u65b9\u6cd5\u548c\u65b9\u6cd5\u53c2\u6570\u4e0a\u3002\u4f46\u662f\u4e0d\u80fd\u7528\u5728\u6210\u5458\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u4e0a<\/p>\n\n\n\n<p>@Valid\uff1a\u53ef\u4ee5\u7528\u5728\u65b9\u6cd5\u3001\u6784\u9020\u51fd\u6570\u3001\u65b9\u6cd5\u53c2\u6570\u548c\u6210\u5458\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u4e0a<\/p>\n\n\n\n<p><span class=\"has-inline-color has-vivid-red-color\">\u4e24\u8005\u662f\u5426\u80fd\u7528\u4e8e\u6210\u5458\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u4e0a\u76f4\u63a5\u5f71\u54cd\u80fd\u5426\u63d0\u4f9b\u5d4c\u5957\u9a8c\u8bc1\u7684\u529f\u80fd\u3002<\/span><\/p>\n\n\n\n<p><strong>3.2\u3001\u5206\u7ec4<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>\u5148\u5b9a\u4e49\u5206\u7ec4\u63a5\u53e3\uff08\u63a5\u53e3\u4ec0\u4e48\u90fd\u4e0d\u9700\u8981\uff0c\u7a7a\u7684\u5c31\u53ef\u4ee5\uff09\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public interface Insert {\n}\n\npublic interface Update {\n}\n<\/pre>\n\n\n\n<p>\u5728\u9700\u8981\u6821\u9a8c\u7684bean\u4e0a\u52a0\u4e0a\u5206\u7ec4\u6ce8\u89e3\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@NotBlank(groups = {Update.class}, message = \"ID\u4e0d\u80fd\u4e3a\u7a7a\")\nprivate String id;\n\n@NotBlank(groups = {Insert.class, Update.class}, message = \"\u540d\u79f0\u4e0d\u80fd\u4e3a\u7a7a\")\n@Size(groups = {Insert.class, Update.class}, max = 32, message = \"\u540d\u79f0\u6700\u5927\u957f\u5ea6\u4e3a32\")\nprivate String name;<\/pre>\n\n\n\n<p>\u6839\u636e\u9700\u8981\uff0c\u5728Controller\u5904\u7406\u8bf7\u6c42\u4e2d\u52a0\u5165 <strong>@Validated<\/strong> \u5e76\u5f15\u5165\u9700\u8981\u6821\u9a8c\u7684\u5206\u7ec4\uff08\u672a\u5f15\u5165\u5206\u7ec4\u5219\u90fd\u6821\u9a8c\uff09<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@PostMapping(\"\/insert\")\npublic int insert(@RequestBody @Validated({Insert.class}) HospitalRequest request) {\n    return hospitalService.insert(request);\n}\n\n@PostMapping(\"\/update\")\npublic int update(@RequestBody @Validated({Update.class}) HospitalRequest request) {\n    return hospitalService.update(request);\n}<\/pre>\n\n\n\n<p><span class=\"has-inline-color has-vivid-red-color\">\u5728\u8fdb\u884cinsert\u7684\u65f6\u5019\u4e0d\u4f1a\u5bf9id\u8fdb\u884c\u6821\u9a8c<\/span><\/p>\n\n\n\n<p><strong>3.3\u3001 \u5d4c\u5957\u9a8c\u8bc1<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>\u5728\u6bd4\u8f83\u4e24\u8005\u5d4c\u5957\u9a8c\u8bc1\u65f6\uff0c\u5148\u8bf4\u660e\u4e0b\u4ec0\u4e48\u53eb\u505a\u5d4c\u5957\u9a8c\u8bc1\u3002\u6bd4\u5982\u6211\u4eec\u73b0\u5728\u6709\u4e2a\u5b9e\u4f53\u53eb\u505aItem\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Item {\n\n    @NotNull(message = \"id\u4e0d\u80fd\u4e3a\u7a7a\")\n    @Min(value = 1, message = \"id\u5fc5\u987b\u4e3a\u6b63\u6574\u6570\")\n    private Long id;\n\n    @NotNull(message = \"props\u4e0d\u80fd\u4e3a\u7a7a\")\n    @Size(min = 1, message = \"\u81f3\u5c11\u8981\u6709\u4e00\u4e2a\u5c5e\u6027\")\n    private List&lt;Prop> props;\n}<\/pre>\n\n\n\n<p>Item\u5e26\u6709\u5f88\u591a\u5c5e\u6027\uff0c\u5c5e\u6027\u91cc\u9762\u6709\u5c5e\u6027id\uff0c\u5c5e\u6027\u503cid\uff0c\u5c5e\u6027\u540d\u548c\u5c5e\u6027\u503c\uff0c\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Prop {\n\n    @NotNull(message = \"pid\u4e0d\u80fd\u4e3a\u7a7a\")\n    @Min(value = 1, message = \"pid\u5fc5\u987b\u4e3a\u6b63\u6574\u6570\")\n    private Long pid;\n\n    @NotNull(message = \"vid\u4e0d\u80fd\u4e3a\u7a7a\")\n    @Min(value = 1, message = \"vid\u5fc5\u987b\u4e3a\u6b63\u6574\u6570\")\n    private Long vid;\n\n    @NotBlank(message = \"pidName\u4e0d\u80fd\u4e3a\u7a7a\")\n    private String pidName;\n\n    @NotBlank(message = \"vidName\u4e0d\u80fd\u4e3a\u7a7a\")\n    private String vidName;\n}<\/pre>\n\n\n\n<p>\u5c5e\u6027\u8fd9\u4e2a\u5b9e\u4f53\u4e5f\u6709\u81ea\u5df1\u7684\u9a8c\u8bc1\u673a\u5236\uff0c\u6bd4\u5982\u5c5e\u6027\u548c\u5c5e\u6027\u503cid\u4e0d\u80fd\u4e3a\u7a7a\uff0c\u5c5e\u6027\u540d\u548c\u5c5e\u6027\u503c\u4e0d\u80fd\u4e3a\u7a7a\u7b49\u3002<\/p>\n\n\n\n<p>\u73b0\u5728\u6211\u4eec\u6709\u4e2aItemController\u63a5\u53d7\u4e00\u4e2aItem\u7684\u5165\u53c2\uff0c\u60f3\u8981\u5bf9Item\u8fdb\u884c\u9a8c\u8bc1\uff0c\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@RestController\npublic class ItemController {\n\n    @RequestMapping(\"\/item\/add\")\n    public void addItem(@Validated Item item, BindingResult bindingResult) {\n        doSomething();\n    }\n}\n<\/pre>\n\n\n\n<p>\u5728\u4e0a\u56fe\u4e2d\uff0c\u5982\u679cItem\u5b9e\u4f53\u7684props\u5c5e\u6027\u4e0d\u989d\u5916\u52a0\u6ce8\u91ca\uff0c\u53ea\u6709@NotNull\u548c@Size\uff0c\u65e0\u8bba\u5165\u53c2\u91c7\u7528@Validated\u8fd8\u662f@Valid\u9a8c\u8bc1\uff0cSpring Validation\u6846\u67b6\u53ea\u4f1a\u5bf9Item\u7684id\u548cprops\u505a\u975e\u7a7a\u548c\u6570\u91cf\u9a8c\u8bc1\uff0c\u4e0d\u4f1a\u5bf9props\u5b57\u6bb5\u91cc\u7684Prop\u5b9e\u4f53\u8fdb\u884c\u5b57\u6bb5\u9a8c\u8bc1\uff0c\u4e5f\u5c31\u662f@Validated\u548c@Valid\u52a0\u5728\u65b9\u6cd5\u53c2\u6570\u524d\uff0c\u90fd\u4e0d\u4f1a\u81ea\u52a8\u5bf9\u53c2\u6570\u8fdb\u884c\u5d4c\u5957\u9a8c\u8bc1\u3002\u4e5f\u5c31\u662f\u8bf4\u5982\u679c\u4f20\u7684List\u4e2d\u6709Prop\u7684pid\u4e3a\u7a7a\u6216\u8005\u662f\u8d1f\u6570\uff0c\u5165\u53c2\u9a8c\u8bc1\u4e0d\u4f1a\u68c0\u6d4b\u51fa\u6765\u3002<\/p>\n\n\n\n<p>\u4e3a\u4e86\u80fd\u591f\u8fdb\u884c\u5d4c\u5957\u9a8c\u8bc1\uff0c\u5fc5\u987b\u624b\u52a8\u5728Item\u5b9e\u4f53\u7684props\u5b57\u6bb5\u4e0a\u660e\u786e\u6307\u51fa\u8fd9\u4e2a\u5b57\u6bb5\u91cc\u9762\u7684\u5b9e\u4f53\u4e5f\u8981\u8fdb\u884c\u9a8c\u8bc1\u3002\u7531\u4e8e@Validated\u4e0d\u80fd\u7528\u5728\u6210\u5458\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u4e0a\uff0c\u4f46\u662f@Valid\u80fd\u52a0\u5728\u6210\u5458\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u4e0a\uff0c\u800c\u4e14@Valid\u7c7b\u6ce8\u89e3\u4e0a\u4e5f\u8bf4\u660e\u4e86\u5b83\u652f\u6301\u5d4c\u5957\u9a8c\u8bc1\u529f\u80fd\uff0c\u90a3\u4e48\u6211\u4eec\u80fd\u591f\u63a8\u65ad\u51fa\uff1a@Valid\u52a0\u5728\u65b9\u6cd5\u53c2\u6570\u65f6\u5e76\u4e0d\u80fd\u591f\u81ea\u52a8\u8fdb\u884c\u5d4c\u5957\u9a8c\u8bc1\uff0c\u800c\u662f\u7528\u5728\u9700\u8981\u5d4c\u5957\u9a8c\u8bc1\u7c7b\u7684\u76f8\u5e94\u5b57\u6bb5\u4e0a\uff0c\u6765\u914d\u5408\u65b9\u6cd5\u53c2\u6570\u4e0a@Validated\u6216@Valid\u6765\u8fdb\u884c\u5d4c\u5957\u9a8c\u8bc1\u3002<\/p>\n\n\n\n<p>\u6211\u4eec\u4fee\u6539Item\u7c7b\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Item {\n\n    @NotNull(message = \"id\u4e0d\u80fd\u4e3a\u7a7a\")\n    @Min(value = 1, message = \"id\u5fc5\u987b\u4e3a\u6b63\u6574\u6570\")\n    private Long id;\n\n    @Valid \/\/ \u5d4c\u5957\u9a8c\u8bc1\u5fc5\u987b\u7528@Valid\n    @NotNull(message = \"props\u4e0d\u80fd\u4e3a\u7a7a\")\n    @Size(min = 1, message = \"props\u81f3\u5c11\u8981\u6709\u4e00\u4e2a\u81ea\u5b9a\u4e49\u5c5e\u6027\")\n    private List&lt;Prop> props;\n}\n<\/pre>\n\n\n\n<p><br><\/p>\n\n\n\n<p>\u7136\u540e\u6211\u4eec\u5728ItemController\u7684addItem\u51fd\u6570\u4e0a\u518d\u4f7f\u7528@Validated\u6216\u8005@Valid\uff0c\u5c31\u80fd\u5bf9Item\u7684\u5165\u53c2\u8fdb\u884c\u5d4c\u5957\u9a8c\u8bc1\u3002\u6b64\u65f6Item\u91cc\u9762\u7684props\u5982\u679c\u542b\u6709Prop\u7684\u76f8\u5e94\u5b57\u6bb5\u4e3a\u7a7a\u7684\u60c5\u51b5\uff0cSpring Validation\u6846\u67b6\u5c31\u4f1a\u68c0\u6d4b\u51fa\u6765\uff0cbindingResult\u5c31\u4f1a\u8bb0\u5f55\u76f8\u5e94\u7684\u9519\u8bef\u3002<\/p>\n\n\n\n<p>\u603b\u7ed3\u4e00\u4e0b@Validated\u548c@Valid\u5728\u5d4c\u5957\u9a8c\u8bc1\u529f\u80fd\u4e0a\u7684\u533a\u522b\uff1a<\/p>\n\n\n\n<ul><li>@Validated\uff1a\u7528\u5728\u65b9\u6cd5\u5165\u53c2\u4e0a\u65e0\u6cd5\u5355\u72ec\u63d0\u4f9b\u5d4c\u5957\u9a8c\u8bc1\u529f\u80fd\u3002\u4e0d\u80fd\u7528\u5728\u6210\u5458\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u4e0a\uff0c\u4e5f\u65e0\u6cd5\u63d0\u793a\u6846\u67b6\u8fdb\u884c\u5d4c\u5957\u9a8c\u8bc1\u3002\u80fd\u914d\u5408\u5d4c\u5957\u9a8c\u8bc1\u6ce8\u89e3@Valid\u8fdb\u884c\u5d4c\u5957\u9a8c\u8bc1\u3002<\/li><\/ul>\n\n\n\n<ul><li>@Valid\uff1a\u7528\u5728\u65b9\u6cd5\u5165\u53c2\u4e0a\u65e0\u6cd5\u5355\u72ec\u63d0\u4f9b\u5d4c\u5957\u9a8c\u8bc1\u529f\u80fd\u3002\u80fd\u591f\u7528\u5728\u6210\u5458\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u4e0a\uff0c\u63d0\u793a\u9a8c\u8bc1\u6846\u67b6\u8fdb\u884c\u5d4c\u5957\u9a8c\u8bc1\u3002\u80fd\u914d\u5408\u5d4c\u5957\u9a8c\u8bc1\u6ce8\u89e3@Valid\u8fdb\u884c\u5d4c\u5957\u9a8c\u8bc1\u3002<\/li><li><code>@Valid<\/code>\u4fdd\u8bc1\u4e86\u6574\u4e2a\u5bf9\u8c61\u7684\u9a8c\u8bc1, \u4f46\u662f\u5b83\u662f\u5bf9\u6574\u4e2a\u5bf9\u8c61\u8fdb\u884c\u9a8c\u8bc1\uff0c\u5f53\u4ec5\u9700\u8981\u90e8\u5206\u9a8c\u8bc1\u7684\u65f6\u5019\u5c31\u4f1a\u51fa\u73b0\u95ee\u9898\u3002 \u8fd9\u65f6\u5019\uff0c\u53ef\u4ee5\u4f7f\u7528<code>@Validated<\/code> \u8fdb\u884c\u5206\u7ec4\u9a8c\u8bc1\u3002<\/li><\/ul>\n\n\n\n<p><strong>\uff14\u3001\u4f7f\u7528BindingResult\u63a5\u6536\u6821\u9a8c\u7ed3\u679c\u4fe1\u606f<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>\u4f7f\u7528\u6ce8\u89e3\u8fdb\u884c\u6821\u9a8c\u7684\u65f6\u5019\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7BindingResult\u6765\u6536\u96c6\u6821\u9a8c\u7ed3\u679c\u4fe1\u606f\uff0c\u5177\u4f53\u64cd\u4f5c\u5982\u4e0b\uff1a<\/p>\n\n\n\n<p>Controller\u4e2d\uff0c\u5728@Valid\u6216@Validated\u4fee\u9970\u7684\u53c2\u6570\u540e\u8ddf\u4e0aBindingResult\u53c2\u6570\uff08@Valid\u6216@Validated \u548c BindingResult \u662f\u4e00 \u4e00\u5bf9\u5e94\u7684\uff0c\u5982\u679c\u6709\u591a\u4e2a@Valid\u6216@Validated\uff0c\u90a3\u4e48\u6bcf\u4e2a@Valid\u6216@Validated\u540e\u9762\u90fd\u9700\u8981\u6dfb\u52a0BindingResult\u7528\u4e8e\u63a5\u6536bean\u4e2d\u7684\u6821\u9a8c\u4fe1\u606f\uff09<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@PostMapping(\"\/insert\")\npublic int insert(@RequestBody @Validated HospitalRequest request, BindingResult bindingResult) {\n    if (bindingResult.hasErrors()) {\n        List&lt;String> collect = bindingResult.getFieldErrors().stream().map(\n                DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.toList());\n        StringBuilder errorMsg = new StringBuilder();\n        for (String s : collect) {\n            errorMsg.append(s);\n            errorMsg.append(\",\");\n        }\n        errorMsg = new StringBuilder(errorMsg.substring(0, errorMsg.length() - 1));\n        log.error(\"\u6821\u9a8c\u672a\u901a\u8fc7\uff1a{}\", errorMsg.toString());\n        Assert.state(Boolean.FALSE, errorMsg.toString());\n    }\n    return hospitalService.insert(request);\n}<\/pre>\n\n\n\n<p>\u8fd9\u6837\u5c31\u53ef\u4ee5\u63a5\u6536\u5230\u6821\u9a8c\u7684\u7ed3\u679c\u4fe1\u606f\uff0c\u53ef\u4ee5\u6839\u636e\u6821\u9a8c\u7684\u7ed3\u679c\u4fe1\u606f\u8fdb\u884c\u4e00\u7cfb\u5217\u64cd\u4f5c\uff0c\u5982\u6253\u5370\u9519\u8bef\u4fe1\u606f\u3001\u629b\u51fa\u6307\u5b9a\u5f02\u5e38\u7b49\u3002<\/p>\n\n\n\n<p><strong>\uff15\u3001\u7edf\u4e00\u5f02\u5e38\u5904\u7406<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>\u5728\u65e5\u5e38\u5f00\u53d1\u4e2d\uff0c\u6211\u4eec\u53ef\u80fd\u9700\u8981\u8ba9\u6821\u9a8c\u8fd4\u56de\u6307\u5b9a\u7684\u4fe1\u606f\u6216\u5bf9\u8c61\uff0c\u8fd9\u65f6\u6211\u4eec\u5c31\u53ef\u4ee5\u8fdb\u884c\u7edf\u4e00\u5f02\u5e38\u5904\u7406\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package com.app.config;\n\nimport com.framework.common.domain.ErrorResponse;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.validation.BindingResult;\nimport org.springframework.validation.FieldError;\nimport org.springframework.validation.ObjectError;\nimport org.springframework.web.bind.MethodArgumentNotValidException;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.bind.annotation.RestControllerAdvice;\n\nimport java.util.List;\n\n\/**\n * \u53c2\u6570\u6821\u9a8c\u5f02\u5e38\u5904\u7406\n *\/\n@Slf4j\n@RestControllerAdvice\npublic class BadRequestExceptionHandler {\n\n    \/**\n     * \u6821\u9a8c\u9519\u8bef\u62e6\u622a\u5904\u7406\n     *\n     * @param exception \u9519\u8bef\u4fe1\u606f\u96c6\u5408\n     * @return ErrorResponse \u9519\u8bef\u54cd\u5e94\uff0c\u5f53HTTP\u54cd\u5e94\u72b6\u6001\u7801\u4e0d\u4e3a200\u65f6\uff0c\u4f7f\u7528\u8be5\u54cd\u5e94\u8fd4\u56de\n     *\/\n    @ResponseStatus(HttpStatus.BAD_REQUEST)\n    @ExceptionHandler(MethodArgumentNotValidException.class)\n    private ErrorResponse validateRequestException(MethodArgumentNotValidException exception) {\n        BindingResult bindingResult = exception.getBindingResult();\n        StringBuilder errorMsg = new StringBuilder();\n        if (bindingResult.hasErrors()) {\n            List&lt;ObjectError> errors = bindingResult.getAllErrors();\n            for (ObjectError objectError : errors) {\n                FieldError fieldError = (FieldError) objectError;\n                if (log.isDebugEnabled()) {\n                    log.error(\"Data check failure : object: {},field: {},errorMessage: {}\",\n                            fieldError.getObjectName(), fieldError.getField(), fieldError.getDefaultMessage());\n                }\n                errorMsg.append(objectError.getDefaultMessage());\n                errorMsg.append(\",\");\n            }\n            errorMsg = new StringBuilder(errorMsg.substring(0, errorMsg.length() - 1));\n        }\n        return new ErrorResponse(\"ILLEGAL_ARGUMENT_ERROR\", errorMsg.toString());\n    }\n}<\/pre>\n\n\n\n<p>\u8fd4\u56de\u7684\u81ea\u5b9a\u4e49\u54cd\u5e94\u4f53\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package com.framework.common.domain;\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n\/**\n * \u9519\u8bef\u54cd\u5e94\uff0c\u5f53HTTP\u54cd\u5e94\u72b6\u6001\u7801\u4e0d\u4e3a200\u65f6\uff0c\u4f7f\u7528\u8be5\u54cd\u5e94\u8fd4\u56de\n *\/\n@JsonIgnoreProperties(ignoreUnknown = true)\n@AllArgsConstructor\n@NoArgsConstructor\n@Data\npublic class ErrorResponse {\n\n\t\/**\n\t * \u9519\u8bef\u7801\n\t *\/\n\tprivate String code;\n\n\t\/**\n\t * \u9519\u8bef\u4fe1\u606f\n\t *\/\n\tprivate String message;\n\n}\n<\/pre>\n\n\n\n<p><strong>\uff16\u3001\u603b\u7ed3<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>\u6700\u540e\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e0b\u3002<\/p>\n\n\n\n<ul><li>1\uff09@validated \u652f\u6301\u5206\u7ec4\u6821\u9a8c\uff0c@valid \u4e0d\u652f\u6301<\/li><li>2\uff09@validated \u548c @valid \u4f7f\u7528\u7684\u5730\u65b9\u4e0d\u4e00\u6837<\/li><li>3\uff09@Validated\uff1a\u7528\u5728\u65b9\u6cd5\u5165\u53c2\u4e0a<strong>\u65e0\u6cd5\u5355\u72ec<\/strong>\u63d0\u4f9b\u5d4c\u5957\u9a8c\u8bc1\u529f\u80fd\u3002<strong>\u4e0d\u80fd<\/strong>\u7528\u5728\u6210\u5458\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u4e0a\u3002\u80fd\u914d\u5408<strong>\u5d4c\u5957\u9a8c\u8bc1<\/strong>\u6ce8\u89e3 @Valid \u8fdb\u884c\u5d4c\u5957\u9a8c\u8bc1\u3002<\/li><li>4\uff09@Valid\uff1a\u7528\u5728\u65b9\u6cd5\u5165\u53c2\u4e0a<strong>\u65e0\u6cd5\u5355\u72ec<\/strong>\u63d0\u4f9b\u5d4c\u5957\u9a8c\u8bc1\u529f\u80fd\u3002<strong>\u80fd<\/strong>\u591f\u7528\u5728\u6210\u5458\u5c5e\u6027\uff08\u5b57\u6bb5\uff09\u4e0a\u3002\u80fd\u914d\u5408<strong>\u5d4c\u5957\u9a8c\u8bc1<\/strong>\u6ce8\u89e3 @Valid \u8fdb\u884c\u5d4c\u5957\u9a8c\u8bc1\u3002<\/li><\/ul>\n\n\n\n<p><strong>7\u3001\u9644<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>\u6700\u8fd1\u5728\u505a\u4e1a\u52a1\u7684\u65f6\u5019\u53d1\u73b0\u6ce8\u89e3@valid\u5728\u63a5\u53e3\u53c2\u6570\u662flist\u7684\u60c5\u51b5\u4e0b\u4e0d\u8d77\u4f5c\u7528\u3002<\/p>\n\n\n\n<p>\u7136\u540e\u53bb\u67e5\u4e86\u4e00\u4e0b\u8d44\u6599\u5f97\u4ee5\u89e3\u51b3\uff0c\u603b\u7ed3\u5982\u4e0b\u4e24\u70b9\uff1a<\/p>\n\n\n\n<p>\u89e3\u51b3\u65b9\u5f0f\uff1a\u5982\u4e0b\u56fe<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/123.57.164.21\/wp-content\/uploads\/2022\/11\/\u56fe\u7247-289-1024x539.png\" alt=\"\" class=\"wp-image-8735\" width=\"593\" height=\"313\" srcset=\"https:\/\/92it.top\/wp-content\/uploads\/2022\/11\/\u56fe\u7247-289-1024x539.png 1024w, https:\/\/92it.top\/wp-content\/uploads\/2022\/11\/\u56fe\u7247-289-300x158.png 300w, https:\/\/92it.top\/wp-content\/uploads\/2022\/11\/\u56fe\u7247-289-768x404.png 768w, https:\/\/92it.top\/wp-content\/uploads\/2022\/11\/\u56fe\u7247-289-1536x808.png 1536w, https:\/\/92it.top\/wp-content\/uploads\/2022\/11\/\u56fe\u7247-289-830x437.png 830w, https:\/\/92it.top\/wp-content\/uploads\/2022\/11\/\u56fe\u7247-289-230x121.png 230w, https:\/\/92it.top\/wp-content\/uploads\/2022\/11\/\u56fe\u7247-289-350x184.png 350w, https:\/\/92it.top\/wp-content\/uploads\/2022\/11\/\u56fe\u7247-289-480x253.png 480w, https:\/\/92it.top\/wp-content\/uploads\/2022\/11\/\u56fe\u7247-289.png 1958w\" sizes=\"(max-width: 593px) 100vw, 593px\" \/><\/figure><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u6211\u4eec\u5728\u5bf9\u5916\u63d0\u4f9b\u63a5\u53e3\u7684\u65f6\u5019\uff0c\u4e3a\u4e86\u63d0\u9ad8\u5b89\u5168\u6027\uff0c\u6211\u4eec\u9700\u8981\u5728\u540e\u7aef\u505a\u6570\u636e\u7684\u6821\u9a8c\u3002\u5b9e\u9645\u4e0a\uff0cJava \u65e9\u5728 2009 \u5e74\u5c31\u63d0 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26,27],"tags":[],"_links":{"self":[{"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts\/8706"}],"collection":[{"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=8706"}],"version-history":[{"count":10,"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts\/8706\/revisions"}],"predecessor-version":[{"id":8739,"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts\/8706\/revisions\/8739"}],"wp:attachment":[{"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=8706"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=8706"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=8706"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}