libro
www.tuyano.com
初心者のためのJava Persistence API入門

Bean Validatorによるバリデーション (3/6)

作成:2017-10-28 10:21
更新:2017-10-28 10:21

■バリデーションのチェック

続いて、エンティティの保存を行う処理にバリデーションチェックを組み込みましょう。これは、いろいろな考え方があります。

もっともシンプルなもの、すなわち、「ただエラーがあるかチェックするだけ」というなら、やることはとても簡単です。エンティティの保存や更新をする処理をtry構文で囲うのです。
try {
    ……エンティティの保存処理……
} catch(ConstraintViolationException  e){
    ……エラー時の処理……
}

たったこれだけです。JPAはエンティティを保存しようとすると、そこに設定されていたバリデーション用のアノテーションをもとに値のチェックを行います。そしてバリデーションルールに反するものが見つかると、ConstraintViolationExceptionという例外を発生させます。後は、catch部分で例外時の処理を行うだけです。

例外が発生すると、保存の処理は実行されません。例外がなければそのまま保存され、先へと進みます。


■エンティティ作成フォームを作る

では、実際にやってみましょう。新しいエンティティを作るフォームを作成して、保存の処理を行なってみます。まずは、JSPにフォームを用意しましょう。index.jsp<body>に、以下のようなタグを用意して下さい。
<%
    request.setCharacterEncoding("utf-8");
    List list = (List)request.getAttribute("list");
    MyDataEntity entity = (MyDataEntity)request.getAttribute("entity");
    String msg = (String)request.getAttribute("msg");
%>
<p><%=msg %></p>
<form method="post" action="/hello">
    NAME:<input type="text" name="name" value="<%= entity.getName() %>">
    MAIL:<input type="text" name="mail" value="<%= entity.getMail() %>">
    TEL :<input type="text" name="tel" value="<%= entity.getTel() %>">
    <input type="submit">
</form>
<ul>
<% for(Object obj : list) { %>
    <li><%=obj %></li>
<% } %>
</ul>

name, mail, telの3つの入力フィールドからなるフォームですね。それぞれ、変数entityの値をvalueに設定するようにしてあります。またメッセージを表示する<%=msg %>も用意しておきました。

これを利用したサーブレットは、下のリスト欄のようになります。実際に /hello にアクセスして、フォームを送信してみましょう。正しく入力できていれば、新しいエンティティが追加されます。問題があれば、「Validation Error!」とメッセージが表示されます。

ここでは、作成したエンティティを保存する部分を以下のようにしてあります。
try {
    manager.persist(entity);
    manager.getTransaction().commit();
} catch(ConstraintViolationException  e){
    List list = getAllEntity();
    request.setAttribute("msg", "<b>Validation Error!</b><br>");
    request.setAttribute("list", list);
    request.setAttribute("entity", entity);
    RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp");
    dispatcher.forward(request,response);
}

あまりスマートじゃありませんが、例外が発生したときは、必要な値を用意してからRequestDispatcherforwardindex.jspの表示を行うようにしてあります。見ればわかるように、バリデーションのための処理は何一つありません。何も特別なことをしなくともちゃんと正常に値が用意されているか確認してくれる、それがBean Validatorです。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

package com.tuyano.libro;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.Set;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;

@WebServlet("/hello")
public class MyDataEntityServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    protected EntityManagerFactory factory = 
        Persistence.createEntityManagerFactory("mydataentity-persistance");

    @Override
    public void init() throws ServletException {
        super.init();
        EntityManager manager = factory.createEntityManager();
        try {
            manager.getTransaction().begin();
            manager.persist(
                new MyDataEntity("taro", "taro@yamada", "090-999-999")
            );

            ……必要なだけダミーエンティティを追加……

            manager.getTransaction().commit();
        } finally {
            manager.close();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response)
            throws ServletException, IOException {
        List list = getAllEntity();
        request.setAttribute("msg", "input Entity:");
        request.setAttribute("list", list);
        request.setAttribute("entity", new MyDataEntity("noname", "", ""));
        RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp");
        dispatcher.forward(request,response);
    }

    @Override
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response)
            throws ServletException, IOException {
        String name = request.getParameter("name");
        String mail = request.getParameter("mail");
        String tel = request.getParameter("tel");
        EntityManager manager = factory.createEntityManager();
        MyDataEntity entity = new MyDataEntity(name, mail, tel); 
        
        manager.getTransaction().begin();
        try {
            manager.persist(entity);
            manager.getTransaction().commit();
        } catch(ConstraintViolationException  e){
            List list = getAllEntity();
            request.setAttribute("msg", "<b>Validation Error!</b><br>");
            request.setAttribute("list", list);
            request.setAttribute("entity", entity);
            RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp");
            dispatcher.forward(request,response);
        }
        response.sendRedirect("/hello");
    }

    private List getAllEntity() {
        EntityManager manager = factory.createEntityManager();
        Query query = manager.createQuery("select e from MyDataEntity e");
        return query.getResultList();
    }
}

※関連コンテンツ

「初心者のためのJava Persistence API入門」に戻る