結論
確認するべき場所は二つ。本記事では、後者について詳細を書き留める。
- 引数なしコンストラクタを定義する
-
@Modelattribute
に名前を定義する
詳細
コントローラメゾッドでNo primary or single unique constructor found for xxx
というエラーが発生する。
原因を探ると、コントローラの引数@ModelAttribute
している処理がうまくいっていないようである。
コントローラの実装
Controller.java
@GetMapping("/page")
public String doProcess(@ModelAttribute boolean blFlg, Model model) {
スタックトレース
java.lang.IllegalStateException: No primary or single unique constructor found for boolean
at org.springframework.beans.BeanUtils.getResolvableConstructor(BeanUtils.java:265)
at org.springframework.validation.DataBinder.createObject(DataBinder.java:926)
at org.springframework.validation.DataBinder.construct(DataBinder.java:905)
at org.springframework.web.bind.ServletRequestDataBinder.construct(ServletRequestDataBinder.java:116)
at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.constructAttribute(ServletModelAttributeMethodProcessor.java:157)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:148)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)
このエラーが発生した場合、該当クラスの引数なしコンストラクタを定義してあるか確認するのが自分の中での定石だったが、boolean
という自作クラスではない、ましてはプリミティブ型でのエラーということで、自作でコンストラクタを用意する必要があるはずもないため、対処法に悩んだ。
解決方法
最終的に、@ModelAttribute
に名前を明示することで解決した。
具体的には@ModelAttribute
を@ModelAttribute("blFlg")
とした。
原理は調べてないため不明だが動くようになったので解決。
Controller.java
@GetMapping("/page")
public String doProcess(@ModelAttribute("blFlg") boolean blFlg, Model model) {