実現したいこと
JavaでWebサイトのログイン画面を開発を学習中です。
CreateNativequeryのエラー回避のやり方を教えて頂けないでしょうか?
<処理の内容>
- ログイン画面に社員番号とパスワードを入力し、DBで社員番号の照合を行う。
- 社員番号でDBを検索し、登録があれば正常ケースとして、index.jspに遷移
- 社員番号がDBに登録がなければ、loginnerro.jspに遷移
(質問内容の詳細)
ログイン画面にデータ未登録の社員番号を入力し、エラー動作の確認を行ったところ、
「IllegalArgumentException」や「NoResultException」などのエラーが出ました。
CreateNativequeryメソッドを使用する場合、データがない場合や検索コードの誤りなど
エラーが起こる場合の対処方法を教えて頂けないでしょうか?
※サイト画面の入力チェックはバリデーションとして実装済です。
発生している問題・エラーメッセージ
タイプ 例外報告
メッセージ 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)
タイプ 例外報告
メッセージ No query defined for that name [select * from employees where code =:code]
説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。
例外
java.lang.IllegalArgumentException: No query defined for that name [select * from employees where code =:code]
該当のソースコード
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("パスワードを入力してください"); } //入力内容にエラーがあるかどうか if (errors.size() > 0) { //エラーありログインエラー System.out.println("ログイン入力エラー"); request.setAttribute("loginError", "true"); request.setAttribute("errors", errors); RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/error/loginerrors.jsp"); rd.forward(request, response); } else { //エラーなしログイン成功 try { Employees employees = (Employees) em .createNativeQuery("select * from employees where code =:code",Employees.class) .setParameter("code", code) .getSingleResult(); System.out.println("ログイン成功"); request.setAttribute("employees", employees); RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/layout/index.jsp"); rd.forward(request, response); } catch (ServletException e) { e.printStackTrace(); } catch (NoResultException e) { System.out.println("ログイン社員番号未登録エラー"); errors.add("社員番号が登録されていません"); e.printStackTrace(); } } }
}
言語
Java
回答1件
あなたの回答
tips
プレビュー