{"id":531,"date":"2023-11-11T19:50:54","date_gmt":"2023-11-11T10:50:54","guid":{"rendered":"https:\/\/tako.nakano.net\/blog\/?p=531"},"modified":"2023-11-11T19:50:54","modified_gmt":"2023-11-11T10:50:54","slug":"using-enums-as-request-parameters-in-spring","status":"publish","type":"post","link":"https:\/\/tako.nakano.net\/blog\/2023\/11\/using-enums-as-request-parameters-in-spring\/","title":{"rendered":"Using Enums as Request Parameters in Spring"},"content":{"rendered":"<h1>Springboot \u306b\u304a\u3044\u3066 Enum \u3092 Request Parameter \u306b\u7528\u3044\u308b\u65b9\u6cd5<\/h1>\n<p>en: Using Enums as Request Parameters in Spring<\/p>\n<p>\u30c6\u30b9\u30c8\u3057\u305f\u5f53\u6642\u306e\u74b0\u5883\u306f:<\/p>\n<p>openjdk version &quot;17.0.8.1&quot; 2023-08-24<br \/>\nOpenJDK Runtime Environment (build 17.0.8.1+1-Ubuntu-0ubuntu122.04)<br \/>\nOpenJDK 64-Bit Server VM (build 17.0.8.1+1-Ubuntu-0ubuntu122.04, mixed mode, sharing)<br \/>\nSpringframework.boot \u304c &#8216;org.springframework.boot&#8217; version &#8216;3.1.5&#8217;<\/p>\n<p>\u3067\u3042\u308b\u3002<\/p>\n<p>\u5927\u4f53\u306e\u90e8\u5206\u306b\u304a\u3044\u3066\u306f\u3001<a href=\"https:\/\/www.baeldung.com\/spring-enum-request-param\" title=\"Using Enums as Request Parameters in Spring\">Using Enums as Request Parameters in Spring<\/a> \u306b\u6e96\u3058\u308c\u3070\u826f\u3044\u304c\u30012\u70b9\u6ce8\u610f\u304c\u5fc5\u8981\u3067\u3042\u3063\u305f\u3002<\/p>\n<p>1\u70b9\u76ee\u306f\u3001<code>@Component<\/code> \u3092\u4f7f\u3063\u305f\u65b9\u304c\u826f\u3055\u305d\u3046\u3068\u3044\u3046\u70b9\u3067\u3042\u308b\u3002<br \/>\n2\u70b9\u76ee\u306f\u3001Enum \u304c\u5024\u3092\u3082\u3064\u5834\u5408\u306e\u6271\u3044\u306b\u3064\u3044\u3066\u3067\u3042\u308b\u3002<\/p>\n<h2><code>@Component<\/code> \u306b\u3064\u3044\u3066<\/h2>\n<p>Spring&#8217;s @RequestParam with Enum \u306e\u56de\u7b54<br \/>\n<a href=\"https:\/\/stackoverflow.com\/questions\/39774427\/springs-requestparam-with-enum\/53266048#53266048\">https:\/\/stackoverflow.com\/questions\/39774427\/springs-requestparam-with-enum\/53266048#53266048<\/a><br \/>\n\u306b\u3001<\/p>\n<blockquote>\n<p>If you are using Spring Boot, <a href=\"https:\/\/github.com\/spring-projects\/spring-boot\/issues\/2116#issuecomment-66622846\" title=\"this is the reason\">this is the reason<\/a> that you should not use <code>WebMvcConfigurationSupport<\/code>.<\/p>\n<\/blockquote>\n<p>\u3068\u3044\u3046\u3082\u306e\u304c\u3042\u3063\u305f\u3002<code>WebMvcConfigurationSupport<\/code> \u3092\u7528\u3044\u308b\u5fc5\u8981\u304c\u306a\u3044\u306e\u3067\u3042\u308c\u3070\u4f7f\u308f\u306a\u304f\u3066\u826f\u3044\u2026\u306e\u3060\u3068\u89e3\u91c8\u3057\u305f\u3002<\/p>\n<p><code>@Configuration<\/code> \u3068 <code>public class WebConfig implements WebMvcConfigurer<\/code> \u3067\u3042\u308b\u30af\u30e9\u30b9\u3092\u7528\u3044\u308b\u3053\u3068\u306a\u304f\u3001\u3082\u3068\u3082\u3068\u306e Converter \u306b\u5bfe\u3057\u3066 <code>@Component<\/code> \u3092\u52a0\u3048\u308b\u3060\u3051\u3067\u5341\u5206\u52d5\u4f5c\u3057\u305f\u3002<\/p>\n<h2>\u5024\u3092\u3082\u3064 Enum \u306b\u5bfe\u3059\u308b\u5de5\u592b\u306b\u3064\u3044\u3066<\/h2>\n<p>Enum \u304c<\/p>\n<pre><code class=\"language-java\">public enum Modes {\n    ALPHA, BETA;\n}<\/code><\/pre>\n<p>\u3067\u306f\u306a\u304f<\/p>\n<pre><code class=\"language-java\">public enum Modes {\n    HIGH(&quot;\u9ad8&quot;), MIDDLE(&quot;\u4e2d&quot;), LOW(&quot;\u4f4e&quot;);\n\n    public final String label;\n\n    private Priority(String label) {\n        this.label = label;\n    }\n}<\/code><\/pre>\n<p>\u306e\u3088\u3046\u306b\u5024\u3092\u3082\u3064\uff08\u6b63\u3057\u3044\u8868\u73fe\u3067\u306f\u306a\u3044\u304b\u3082\u3057\u308c\u306a\u3044\uff09\u5834\u5408\u306b\u304a\u3044\u3066\u82e5\u5e72\u5de5\u592b\u304c\u5fc5\u8981\u3060\u3063\u305f\u306e\u3067\u66f8\u304d\u6b8b\u3057\u3066\u304a\u304f\u3002<\/p>\n<p>\u5143\u306e\u4f8b\u3067\u306f:<\/p>\n<pre><code class=\"language-java\">public class StringToEnumConverter implements Converter&lt;String, Modes&gt; {\n    @Override\n    public Modes convert(String source) {\n        return Modes.valueOf(source.toUpperCase());\n    }\n}<\/code><\/pre>\n<p>\u306e\u3088\u3046\u306b\u3057\u3066\u3044\u305f\u3002<\/p>\n<p>\u3053\u3053\u3067\u306f\u3001Priority \u3092\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u5b9a\u7fa9\u3059\u308b:<\/p>\n<pre><code class=\"language-java\">import java.util.Map;\nimport java.util.Optional;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\n\npublic enum Priority {\n    HIGH(&quot;\u9ad8&quot;), MIDDLE(&quot;\u4e2d&quot;), LOW(&quot;\u4f4e&quot;);\n\n    public static final Map&lt;String, Priority&gt; PRIORITY_LABEL_MAP = Stream.of(Priority.values()).collect(Collectors.toMap(t -&gt; t.label, t -&gt; t));\n\n    public final String label;\n\n    private Priority(String label) {\n        this.label = label;\n    }\n\n    public static Optional&lt;Priority&gt; findByLabel(String label) {\n        return Optional.ofNullable(PRIORITY_LABEL_MAP.get(label));\n    }\n}<\/code><\/pre>\n<p>Priority \u306f label \u3092\u6301\u3064\u3002URL \u3067\u306f\u3001\u300c\u9ad8\u300d\u3084\u300c\u4e2d\u300d\u3068\u3044\u3046\u5024\u3092 query string \u3068\u3057\u3066\u53d7\u3051\u53d6\u308b\u3002\u3064\u307e\u308a\u3001Controller \u306f\u3001\u300c\u9ad8\u300d\u3084\u300c\u4e2d\u300d\u306e\u5f62\u3067 URL \u306b\u73fe\u308c\u308b Query Parameter \u3092 RequestParam \u3068\u3057\u3066\u53d7\u3051\u53d6\u308a\u305f\u3044\u305f\u3081\u3001Converter \u306f\u305d\u308c\u3092\u8003\u616e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u3002<\/p>\n<p>\u4f8b\u3048\u3070\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u3057\u3066\u3042\u3052\u308b\u3068\u826f\u3044\u3002<\/p>\n<pre><code class=\"language-java\">import java.util.Optional;\nimport org.springframework.core.convert.converter.Converter;\nimport org.springframework.stereotype.Component;\nimport com.example.demo.enums.Priority;\n\n@Component\npublic class LabelToPriorityConverter implements Converter&lt;String, Optional&lt;Priority&gt;&gt; {\n\n    @Override\n    public Optional&lt;Priority&gt; convert(String label) {\n        return Priority.findByLabel(label);\n    }\n}<\/code><\/pre>\n<p>\u3064\u307e\u308a\u3001<code>org.springframework.core.convert.converter.Converter<\/code> \u3092 implement \u3057\u305f\u30af\u30e9\u30b9\u304c\u3001<code>@org.springframework.stereotype.Component<\/code> \u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u3055\u308c\u3066\u3044\u308c\u3070\u826f\u3044\u3002<\/p>\n<p>Controller \u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u308c\u3070\u826f\u3044\uff08\u4e00\u90e8\u629c\u7c8b\uff09<\/p>\n<pre><code class=\"language-java\">@GetMapping\n    public String getWithEnum(\n            @RequestParam(value = &quot;priority&quot;) Optional&lt;Priority&gt; priority) {\n...\n    }<\/code><\/pre>\n<p>\u52d5\u4f5c\u3059\u308b\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092<br \/>\n<a href=\"https:\/\/github.com\/takotakot\/spring-test\/blob\/enum_param\">https:\/\/github.com\/takotakot\/spring-test\/blob\/enum_param<\/a><br \/>\n\u306b\u7f6e\u3044\u3066\u304a\u304f\u3053\u3068\u306b\u3057\u305f\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/takotakot\/spring-test\/blob\/enum_param\/src\/main\/java\/com\/example\/demo\/enums\/Priority.java\" title=\"Priority.java\">Priority.java<\/a><br \/>\n<a href=\"https:\/\/github.com\/takotakot\/spring-test\/blob\/enum_param\/src\/main\/java\/com\/example\/demo\/controller\/converter\/LabelToPriorityConverter.java\" title=\"LabelToPriorityConverter.java\">LabelToPriorityConverter.java<\/a><br \/>\n<a href=\"https:\/\/github.com\/takotakot\/spring-test\/blob\/enum_param\/src\/main\/java\/com\/example\/demo\/controller\/EnumController.java\" title=\"EnumController.java\">EnumController.java<\/a><\/p>\n<p>\u30b5\u30f3\u30d7\u30eb\u306e\u30c6\u30b9\u30c8\u3082 <a href=\"https:\/\/github.com\/takotakot\/spring-test\/blob\/enum_param\/src\/test\/java\/com\/example\/demo\/controller\/EnumControllerTest.java\" title=\"EnumControllerTest.java\">EnumControllerTest.java<\/a> \u306b\u7f6e\u3044\u3066\u3042\u308b\u3002<\/p>\n<p>\u826f\u304f\u30b3\u30fc\u30c9\u7d20\u7247\u304c\u52d5\u304f\u5f62\u3067\u304a\u304b\u308c\u3066\u3044\u306a\u3044\u305f\u3081\u3001\u521d\u5fc3\u8005\u306b\u306f\u5206\u304b\u3089\u306a\u3044\u2026\u3068\u3044\u3046\u3053\u3068\u304c\u591a\u3044\u306e\u3067\u3001\u52d5\u4f5c\u3059\u308b\u30b3\u30fc\u30c9\u4e00\u5f0f\u306b\u3057\u3066\u304a\u3044\u305f\u3002<\/p>\n<h2>\u5099\u8003<\/h2>\n<p>\u3082\u3046\u5c11\u3057 DRY (Don&#8217;t Repeat Yourself) \u306e\u539f\u5247\u306b\u5f93\u3063\u3066\u3001\u8907\u6570\u306e Enum \u306b\u3064\u3044\u3066\u3082\u5909\u63db\u3057\u3066\u53d7\u3051\u53d6\u308b\u3067\u304d\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u306f\u3001<a href=\"https:\/\/qiita.com\/yushi_koga\/items\/ff3338c34ce59c20bd5f\" title=\"Spring MVC\u306eRestController\u306eRequestParam\u3067\u4efb\u610f\u306eEnum\u3092\u30b3\u30fc\u30c9\u306a\u3069\u306e\u5225\u306e\u5024\u3067\u53d7\u3051\u53d6\u308b\u65b9\u6cd5\">Spring MVC\u306eRestController\u306eRequestParam\u3067\u4efb\u610f\u306eEnum\u3092\u30b3\u30fc\u30c9\u306a\u3069\u306e\u5225\u306e\u5024\u3067\u53d7\u3051\u53d6\u308b\u65b9\u6cd5<\/a>\u304c\u826f\u3055\u305d\u3046\u3067\u3042\u308b\u3002<\/p>\n<p>\u53c2\u8003<\/p>\n<ul>\n<li>Using Enums as Request Parameters in Spring <a href=\"https:\/\/www.baeldung.com\/spring-enum-request-param\">https:\/\/www.baeldung.com\/spring-enum-request-param<\/a><\/li>\n<li>Spring&#8217;s @RequestParam with Enum \u306e\u56de\u7b54 <a href=\"https:\/\/stackoverflow.com\/questions\/39774427\/springs-requestparam-with-enum\/53266048#53266048\">https:\/\/stackoverflow.com\/questions\/39774427\/springs-requestparam-with-enum\/53266048#53266048<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/spring-projects\/spring-boot\/issues\/2116#issuecomment-66622846\">https:\/\/github.com\/spring-projects\/spring-boot\/issues\/2116#issuecomment-66622846<\/a><\/li>\n<li>Spring MVC\u306eRestController\u306eRequestParam\u3067\u4efb\u610f\u306eEnum\u3092\u30b3\u30fc\u30c9\u306a\u3069\u306e\u5225\u306e\u5024\u3067\u53d7\u3051\u53d6\u308b\u65b9\u6cd5 <a href=\"https:\/\/qiita.com\/yushi_koga\/items\/ff3338c34ce59c20bd5f\">https:\/\/qiita.com\/yushi_koga\/items\/ff3338c34ce59c20bd5f<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Springboot \u306b\u304a\u3044\u3066 Enum \u3092 Request Parameter \u306b\u7528\u3044\u308b\u65b9\u6cd5 en: Using Enums as Request Parameters in Spring \u30c6\u30b9\u30c8\u3057\u305f\u5f53\u6642\u306e\u74b0\u5883\u306f: o [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[18],"tags":[],"class_list":["post-531","post","type-post","status-publish","format-standard","hentry","category-java"],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p4dIdP-8z","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/tako.nakano.net\/blog\/wp-json\/wp\/v2\/posts\/531","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tako.nakano.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tako.nakano.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tako.nakano.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tako.nakano.net\/blog\/wp-json\/wp\/v2\/comments?post=531"}],"version-history":[{"count":7,"href":"https:\/\/tako.nakano.net\/blog\/wp-json\/wp\/v2\/posts\/531\/revisions"}],"predecessor-version":[{"id":538,"href":"https:\/\/tako.nakano.net\/blog\/wp-json\/wp\/v2\/posts\/531\/revisions\/538"}],"wp:attachment":[{"href":"https:\/\/tako.nakano.net\/blog\/wp-json\/wp\/v2\/media?parent=531"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tako.nakano.net\/blog\/wp-json\/wp\/v2\/categories?post=531"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tako.nakano.net\/blog\/wp-json\/wp\/v2\/tags?post=531"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}