{"id":6398,"date":"2026-03-01T16:20:35","date_gmt":"2026-03-01T07:20:35","guid":{"rendered":"https:\/\/route-zero.com\/recruit\/?post_type=route&#038;p=6398"},"modified":"2026-10-01T16:20:45","modified_gmt":"2026-10-01T07:20:45","slug":"spring-boot-valid-validated-difference","status":"publish","type":"route","link":"https:\/\/route-zero.com\/recruit\/route\/6398\/","title":{"rendered":"Spring Boot\u306e@Valid\u3068@Validated\u306e\u9055\u3044"},"content":{"rendered":"<p>Spring Boot\u3067\u5165\u529b\u30c1\u30a7\u30c3\u30af\u3092\u66f8\u304f\u3068\u3001`@Valid`\u3068`@Validated`\u306e\u3069\u3061\u3089\u3092\u4f7f\u3046\u304b\u8ff7\u3046\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002\u901a\u5e38\u306eBean Validation\u306a\u3089`@Valid`\u3067\u5341\u5206\u306a\u5834\u9762\u304c\u591a\u304f\u3001Validation Groups\u3092\u660e\u793a\u3057\u3066\u691c\u8a3c\u5bfe\u8c61\u3092\u5207\u308a\u66ff\u3048\u305f\u3044\u3068\u304d\u306fSpring\u306e`@Validated`\u304c\u4f7f\u3044\u3084\u3059\u3044\u3001\u3068\u3044\u3046\u306e\u304c\u57fa\u672c\u306e\u5224\u65ad\u3067\u3059\u3002<\/p>\n<h2>\u307e\u305a\u6bd4\u8f03\uff1a@Valid\u3068@Validated\u306e\u9055\u3044<\/h2>\n<table>\n<thead>\n<tr>\n<th>\u89b3\u70b9<\/th>\n<th>@Valid<\/th>\n<th>@Validated<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u63d0\u4f9b\u5143<\/td>\n<td>Jakarta Validation<\/td>\n<td>Spring Framework<\/td>\n<\/tr>\n<tr>\n<td>\u57fa\u672cValidation<\/td>\n<td>\u3067\u304d\u308b<\/td>\n<td>\u3067\u304d\u308b<\/td>\n<\/tr>\n<tr>\n<td>Validation Groups\u6307\u5b9a<\/td>\n<td>Annotation\u81ea\u4f53\u3067\u306f\u6307\u5b9a\u3057\u306a\u3044<\/td>\n<td>value\u3067Group\u3092\u6307\u5b9a\u3067\u304d\u308b<\/td>\n<\/tr>\n<tr>\n<td>\u30cd\u30b9\u30c8Object\u306ecascade<\/td>\n<td>\u4e3b\u306a\u7528\u9014\u306e1\u3064<\/td>\n<td>\u5fc5\u8981\u306b\u5fdc\u3058\u3066@Valid\u3068\u7d44\u307f\u5408\u308f\u305b\u308b<\/td>\n<\/tr>\n<tr>\n<td>\u5178\u578b\u7528\u9014<\/td>\n<td>\u901a\u5e38\u306e\u5165\u529bObject\u691c\u8a3c<\/td>\n<td>Group\u3092\u5207\u308a\u66ff\u3048\u308b\u691c\u8a3c\u30fbSpring\u306emethod validation<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Spring MVC\u3067\u306f\u3001`@RequestBody`\u306a\u3069\u306emethod parameter\u306b`@Valid`\u307e\u305f\u306f`@Validated`\u3092\u4ed8\u3051\u308b\u3068Standard Bean Validation\u3092\u9069\u7528\u3067\u304d\u307e\u3059\u3002\u9055\u3044\u304c\u5927\u304d\u304f\u51fa\u308b\u306e\u306f\u3001Validation Group\u3092\u4f7f\u3046\u3068\u304d\u3067\u3059\u3002<\/p>\n<hr>\n<h2>@Valid\u306fJakarta Validation\u306e\u6a19\u6e96Annotation<\/h2>\n<p>`@Valid`\u306fSpring\u56fa\u6709\u3067\u306f\u306a\u304fJakarta Validation\u5074\u306eAnnotation\u3067\u3059\u3002Controller\u306e\u5165\u529bObject\u3084\u30cd\u30b9\u30c8\u3057\u305fObject\u3078Validation\u3092\u4f1d\u64ad\u3055\u305b\u308b\u7528\u9014\u3067\u4f7f\u308f\u308c\u307e\u3059\u3002<\/p>\n<pre><code>public record CreateUserRequest(\r\n    @NotBlank String name,\r\n    @Email String email\r\n) {}\r\n\r\n@PostMapping(&quot;\/users&quot;)\r\npublic void create(@Valid @RequestBody CreateUserRequest request) {\r\n    \/\/ validation passed\r\n}<\/code><\/pre>\n<p>\uff08\u307e\u305a@Valid\u3092\u4f7f\u3063\u305fSpring Boot\u306e\u57fa\u672cValidation\u3092\u78ba\u8a8d\u3057\u305f\u3044\u5834\u5408\u306b\u3064\u3044\u3066\u306f\u300e<a href=\"https:\/\/route-zero.com\/recruit\/route\/1256\/\">Spring Boot\u306e\u30d5\u30a9\u30fc\u30e0\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3068\u306f\uff1f@Valid\u3067\u5b89\u5168\u306a\u5165\u529b\u30c1\u30a7\u30c3\u30af\u3092\u5b9f\u73fe\u3057\u3088\u3046<\/a>\u300f\u3092\u3054\u53c2\u7167\u304f\u3060\u3055\u3044\uff09<\/p>\n<hr>\n<h2>@Validated\u306fSpring\u306eAnnotation\u3067Groups\u3092\u6307\u5b9a\u3067\u304d\u308b<\/h2>\n<p>`@Validated`\u306fSpring Framework\u306eAnnotation\u3067\u3059\u3002Spring\u306e`SmartValidator`\u3078validation hint\u3092\u6e21\u3059\u4ed5\u7d44\u307f\u3092\u4f7f\u3044\u3001Validation Group\u306eclass\u3092\u6307\u5b9a\u3067\u304d\u307e\u3059\u3002\u767b\u9332\u6642\u3068\u66f4\u65b0\u6642\u3067\u691c\u8a3c\u30eb\u30fc\u30eb\u3092\u5909\u3048\u308b\u3088\u3046\u306a\u30b1\u30fc\u30b9\u3067\u4fbf\u5229\u3067\u3059\u3002<\/p>\n<pre><code>public interface CreateGroup {}\r\npublic interface UpdateGroup {}\r\n\r\npublic class UserRequest {\r\n    @NotBlank(groups = CreateGroup.class)\r\n    private String name;\r\n\r\n    @NotNull(groups = UpdateGroup.class)\r\n    private Long id;\r\n}<\/code><\/pre>\n<pre><code>@PostMapping(&quot;\/users&quot;)\r\npublic void create(\r\n    @Validated(CreateGroup.class) @RequestBody UserRequest request\r\n) {\r\n}\r\n\r\n@PutMapping(&quot;\/users\/{id}&quot;)\r\npublic void update(\r\n    @Validated(UpdateGroup.class) @RequestBody UserRequest request\r\n) {\r\n}<\/code><\/pre>\n<hr>\n<h2>Validation Groups\u306f\u300e\u540c\u3058DTO\u306e\u691c\u8a3c\u6761\u4ef6\u3092\u5207\u308a\u66ff\u3048\u308b\u300f\u4ed5\u7d44\u307f<\/h2>\n<p>Jakarta Validation\u3067\u306f\u3001\u5404constraint\u30921\u3064\u4ee5\u4e0a\u306eGroup\u3078\u6240\u5c5e\u3055\u305b\u3089\u308c\u307e\u3059\u3002Group\u3092\u6307\u5b9a\u3057\u306a\u3044constraint\u306fDefault group\u306b\u5c5e\u3057\u307e\u3059\u3002Create\/Update\u306e\u3088\u3046\u306b\u72b6\u614b\u3054\u3068\u306b\u5fc5\u8981\u306aconstraint\u304c\u9055\u3046\u5834\u5408\u3001Group\u3092\u4f7f\u3063\u3066\u691c\u8a3c\u5bfe\u8c61\u3092\u5207\u308a\u66ff\u3048\u3089\u308c\u307e\u3059\u3002<\/p>\n<table>\n<thead>\n<tr>\n<th>\u30b1\u30fc\u30b9<\/th>\n<th>\u5411\u304f\u65b9\u6cd5<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u5168\u64cd\u4f5c\u3067\u540c\u3058constraint<\/td>\n<td>Default group + @Valid<\/td>\n<\/tr>\n<tr>\n<td>\u4f5c\u6210\u6642\u3060\u3051\u5fc5\u9808<\/td>\n<td>CreateGroup + @Validated<\/td>\n<\/tr>\n<tr>\n<td>\u66f4\u65b0\u6642\u3060\u3051\u5fc5\u9808<\/td>\n<td>UpdateGroup + @Validated<\/td>\n<\/tr>\n<tr>\n<td>\u30cd\u30b9\u30c8Object\u3082\u691c\u8a3c<\/td>\n<td>@Valid\u306b\u3088\u308bcascade\u3092\u78ba\u8a8d<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Controller\u3067\u306fmethod validation\u3068\u306e\u9055\u3044\u306b\u3082\u6ce8\u610f\u3059\u308b<\/h2>\n<p>Spring MVC\u306e\u73fe\u884c\u4ed5\u69d8\u3067\u306f\u3001Request Object\u306eValidation\u3068\u3001method parameter\u3078\u76f4\u63a5`@NotBlank`\u3084`@Min`\u306a\u3069\u3092\u4ed8\u3051\u308bmethod validation\u306f\u5225\u306e\u7d4c\u8def\u3067\u3059\u3002\u76f4\u63a5constraint\u304c\u3042\u308b\u5834\u5408\u306fmethod validation\u304c\u9069\u7528\u3055\u308c\u3001`HandlerMethodValidationException`\u304c\u4f7f\u308f\u308c\u308b\u30b1\u30fc\u30b9\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>\u307e\u305fSpring Framework 6.1\u4ee5\u964d\u306eMVC built-in method validation\u3092\u4f7f\u3046Controller\u3067\u306f\u3001class-level\u306e`@Validated`\u3092\u5916\u3059\u3088\u3046\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3067\u6848\u5185\u3055\u308c\u3066\u3044\u307e\u3059\u3002Service\u5c64\u306a\u3069AOP\u3092\u4f7f\u3046method validation\u3068\u306f\u533a\u5225\u3057\u3066\u8003\u3048\u307e\u3059\u3002<\/p>\n<h2>\u3088\u304f\u3042\u308b\u6df7\u540c\uff1a@Validated\u306b\u5909\u3048\u308c\u3070Validation\u304c\u76f4\u308b\u308f\u3051\u3067\u306f\u306a\u3044<\/h2>\n<p>Validation\u304c\u52b9\u304b\u306a\u3044\u539f\u56e0\u304cdependency\u4e0d\u8db3\u3001constraint\u306e\u4ed8\u3051\u5fd8\u308c\u3001BindingResult\u306e\u6271\u3044\u3001method signature\u306a\u3069\u306b\u3042\u308b\u5834\u5408\u3001`@Valid`\u3092`@Validated`\u3078\u7f6e\u304d\u63db\u3048\u308b\u3060\u3051\u3067\u306f\u89e3\u6c7a\u3057\u307e\u305b\u3093\u3002Groups\u304c\u5fc5\u8981\u306a\u306e\u304b\u3001\u305d\u3082\u305d\u3082Validation\u304c\u767a\u706b\u3057\u3066\u3044\u306a\u3044\u306e\u304b\u3092\u5206\u3051\u3066\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n<p>\uff08Validation\u81ea\u4f53\u304c\u52d5\u304b\u306a\u3044\u5834\u5408\u306e\u78ba\u8a8d\u30dd\u30a4\u30f3\u30c8\u306b\u3064\u3044\u3066\u306f\u300e<a href=\"https:\/\/route-zero.com\/recruit\/route\/1894\/\">Spring Boot \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u52b9\u304b\u306a\u3044\uff1f5\u5206\u3067\u76f4\u3059\u65b9\u6cd5<\/a>\u300f\u3092\u3054\u53c2\u7167\u304f\u3060\u3055\u3044\uff09<\/p>\n<h2>\u4f7f\u3044\u5206\u3051\u306e\u5224\u65ad\u57fa\u6e96<\/h2>\n<ul>\n<li>\u901a\u5e38\u306eRequest Object\u691c\u8a3c\u306a\u3089\u307e\u305a@Valid<\/li>\n<li>Create\/Update\u306a\u3069Group\u3092\u6307\u5b9a\u3059\u308b\u306a\u3089@Validated(Group.class)<\/li>\n<li>\u30cd\u30b9\u30c8Object\u306ecascade\u306f@Valid\u306e\u6709\u7121\u3092\u78ba\u8a8d<\/li>\n<li>Controller\u306emethod parameter\u3078\u76f4\u63a5constraint\u3092\u7f6e\u304f\u5834\u5408\u306fmethod validation\u306e\u4f8b\u5916\u7d4c\u8def\u3082\u78ba\u8a8d<\/li>\n<li>Annotation\u3092\u5909\u3048\u308b\u524d\u306b\u3001\u4f55\u3092\u5207\u308a\u66ff\u3048\u305f\u3044\u306e\u304b\u3092\u660e\u78ba\u306b\u3059\u308b<\/li>\n<\/ul>\n<p>\u73fe\u5728\u306eDTO\u3067Create\u3068Update\u306econstraint\u304c\u6df7\u5728\u3057\u3066\u3044\u308b\u306a\u3089\u3001\u307e\u305aGroup\u306b\u5206\u3051\u308b\u5fc5\u8981\u304c\u3042\u308b\u304b\u3092\u78ba\u8a8d\u3057\u3066\u304b\u3089`@Validated`\u3092\u5c0e\u5165\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n","protected":false},"featured_media":6402,"template":"","meta":{"ssp_meta_title":"Spring Boot\u306e@Valid\u3068@Validated\u306e\u9055\u3044\uff5cGroups\u3068\u4f7f\u3044\u5206\u3051","ssp_meta_description":"Spring Boot\u306e@Valid\u3068@Validated\u306e\u9055\u3044\u3092\u89e3\u8aac\u3002\u6a19\u6e96\u306eJakarta Validation\u3001Spring\u72ec\u81ea\u306e@Validated\u3001Validation Groups\u3001Controller\u5f15\u6570\u3084\u30cd\u30b9\u30c8\u3057\u305fObject\u3067\u306e\u4f7f\u3044\u5206\u3051\u3092\u30b3\u30fc\u30c9\u4ed8\u304d\u3067\u6574\u7406\u3057\u307e\u3059\u3002","ssp_meta_keyword":"Spring Boot @Valid @Validated \u9055\u3044,@Valid,@Validated,Validation Groups,Spring Boot validation,Jakarta Validation,Spring MVC","ssp_meta_canonical":""},"route_category":[9],"_links":{"self":[{"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/route\/6398"}],"collection":[{"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/route"}],"about":[{"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/types\/route"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/media\/6402"}],"wp:attachment":[{"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/media?parent=6398"}],"wp:term":[{"taxonomy":"route_category","embeddable":true,"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/route_category?post=6398"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}