SpringMVCでValidationチェックする

springspring

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を返します。

以下、エラー時の画面です。

SpringMVCでValidationチェックする

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"/>

SpringMVCでValidationチェックする

コメント

タイトルとURLをコピーしました