実現したいこと
JavaでWebサイトのログイン画面を開発を学習中です。
「NoResultException」の対処方法について教えて頂けないでしょうか?
<処理の内容>
- ログイン画面に社員番号とパスワードを入力し、DBで社員番号の照合を行う。
- 社員番号でDBを検索し、登録があれば正常ケースとして、index.jspに遷移
- 社員番号がDBに登録がなければ、loginnerro.jspに遷移
(質問内容の詳細)
社員番号がDBに登録がない→DBの検索結果がない場合、NoResultExceptionが出ます。
NoResultExceptionをうまく利用して、検索結果がない場合も正常終了するようにしたいのですが、良いコーディング方法を教えて頂けないでしょうか?
発生している問題・エラーメッセージ
タイプ 例外報告
メッセージ No entity found for query
説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。
例外
javax.persistence.NoResultException: No entity found for query
org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1643)
controllers.LoginServlet.doPost(LoginServlet.java:78)
該当のソースコード
package controllers; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.NoResultException; 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 models.Employees; import utils.DBUtil; /** * Servlet implementation class LoginServlet */ @WebServlet("/login") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public LoginServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/layout/login.jsp"); rd.forward(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, NoResultException{ // TODO Auto-generated method stub System.out.println("LoginservletPost"); EntityManager em = DBUtil.createEntityManager(); String code = request.getParameter("emp_number"); String password = request.getParameter("emp_pass"); System.out.println("emp_number" + code); System.out.println("password" + password); List<String> errors = new ArrayList<String>(); //社員番号のブランクチェック if (code == null || code.equals("")) { errors.add("社員番号を入力してください"); } //パスワードのブランクチェック if (password == null || password.equals("")) { errors.add("パスワードを入力してください"); } //Employeeデータベースから社員番号索引 Employees employees = (Employees) em .createNativeQuery("select * from employees where code =:code", Employees.class) .setParameter("code", code) .getSingleResult(); //入力内容にエラーがあるかどうか if (errors.size() > 0) { //エラーありログインエラー System.out.println("loginError"); request.setAttribute("loginError", "true"); request.setAttribute("errors", errors); RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/error/loginerrors.jsp"); rd.forward(request, response); } else { //エラーなしログイン成功 request.setAttribute("employees", employees); RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/layout/index.jsp"); rd.forward(request, response); } } }
試したこと
Employees employees = (Employees) em .createNativeQuery("select * from employees where code =:code", Employees.class) .setParameter("code", code) .getSingleResult();
の箇所に、try-catchしてNoResultExceptionをcatchするようにしたのですが、
Employeesクラスの初期化がうまくいかず、エラーが解消されませんでした。
対処方法はtry-catchなのかな、とは思っているのですが、
どの位置に入れる事が適切か、教えて頂けると幸いです。
素人質問で申し訳ないです。
言語
Java
0 コメント