SpringMVCでValidationチェックする
SpringMVCでデータ送信チェックしたい場合はまずpom.xmlに以下を追加します。
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.0.0.GA</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.1.3.Final</version> </dependency>
これを追加していないと@NotBlankや@NotEmptyアノテーションが使用できません。
が、ここでTomcatを起動すると「java.lang.NoClassDefFoundError: javax/validation/ParameterNameProvider」とエラーが出るようになりました。
どうもvalidation-apiが1.0.xとhibernate-validatorが5.xでは互換性がないようです。
ということで、validation-apiのバージョンを1.1.0.Finalに変更します。
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.0.0.Final</version> </dependency>
これでTomcatを起動してエラーが出なければOKです。
アクションフォームのプライベート変数に@NotEmptyを指定します。(Lombokを使用しているのでgetter,setterはなし)
package jp.co.confrage; import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.NotEmpty; @Data @AllArgsConstructor @NoArgsConstructor public class HomeForm implements Serializable { private static final long serialVersionUID = 1L; @NotEmpty private String keyword; }
送信ボタン押下時のコントローラのメソッドの引数にBindingResultクラスを追加します。
それとアクションフォームの前に@Validアノテーションを指定します。
package jp.co.confrage; import javax.validation.Valid; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping("sample") public class PostController { private static final Logger logger = LoggerFactory.getLogger(PostController.class); @RequestMapping(value="post", method=RequestMethod.POST) public String post(@Valid HomeForm form,BindingResult result,Model model) { logger.info("Post : " + form.getKeyword()); // エラーの場合 if(result.hasErrors()) { return "home"; } model.addAttribute("postData", form.getKeyword()); return "post"; } }
これで、アクションフォームのkeywordが””の場合、result.haserrorsメソッドがtrueとなります。
その場合、ビュー名にhomeを返します。
以下、エラー時の画面です。
JSPは以下のとおりです。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>Home</title> </head> <body> <h1> Hello world! </h1> <P> Welcome Sample Page. </P> <spring:url value="/sample/post" var="act" /> <form:form action="${act}" method="post" modelAttribute="homeForm"> <form:label path="keyword">入力</form:label> <form:input path="keyword" /> <form:errors path="keyword" cssStyle="color:red" /> <input type="submit" value="送信" /> </form:form> </body> </html>
form:errorsを以下のように変更すると、エラーメッセージがhtmlタグ要素(今回はdiv)で囲まれるようになります。
<form:errors path="keyword" cssStyle="color:red" element="div"/>
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント