質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

社員を登録する際にエラーが出てしまいます

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 950

Ryo1504

score 8

私は、JSPとサーブレットで社員を登録するシステムを作っています。
社員登録確認画面まではいくのですが、社員完了画面にいく際に、500エラーが発生してしまいます。
コンソールで原因を調べてみると、DAOのps.setString(7, employee.getDepartment().getDeptId());
というコードでエラーが出ていました。
実現したいことは、社員完了画面までいって社員登録ができていることです。

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>社員登録</title>
</head>
<body>
<h3>社員登録確認画面</h3>
<div class="update">
<div class="form">
<div class="label">パスワード:</div>
<div class="input">${employee.empPass}</div>
</div>
<div class="form">
<div class="label">社員名:</div>
<div class="input">${employee.empName}</div>
</div>
<div class="form">
<div class="label">性別:</div>
<div class="input"><c:choose><c:when test="${employee.gender==1}">男性</c:when>
<c:when test="${employee.gender==2}">女性</c:when>
<c:otherwise> ? </c:otherwise></c:choose></div>
</div>
<div class="form">
<div class="label">住所:</div>
<div class="input">${employee.address}</div>
</div>
<div class="form">
<div class="label">生年月日:</div>
<div class="input">${employee.birthday}</div>
</div>
<div class="form">
<div class="label">権限:</div>
<div class="input"><c:choose><c:when test="${employee.authority==1}">一般</c:when>
<c:when test="${employee.authority==2}">管理者</c:when>
<c:otherwise> ? </c:otherwise></c:choose></div>
</div>
<div class="form">
<div class="label">部署名:</div>
<div class="input">${employee.department.deptName}</div>
</div>
<form action="<%=request.getContextPath()%>/Insert" method="post">
<div class="form">
<div class="label"></div>
<div class="input">
<input type="hidden" name="empPass" value="${employee.empPass}" />
<input type="hidden" name="empName" value="${employee.empName}" />
<input type="hidden" name="gender" value="${employee.gender}" />
<input type="hidden" name="address" value="${employee.address}" />
<input type="hidden" name="birthday" value="${employee.birthday}" />
<input type="hidden" name="authority"value="${employee.authority}" />
<input type="hidden" name="deptName" value="${department.deptId}" />
<input type="submit" value="登録" />
</div>
</div>
</form>
<form action="/servlet_crud/jsp/sample01/regist_input.jsp">
<div class="form">
<div class="label"></div>
<div class="input">
<input type="submit" value="戻る" />
</div>
</div>
</form>
</div>
</div>
</body>
</html>
package jp.co.sss.servlet.regist;
import java.io.IOException;
import java.sql.SQLException;
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 jp.co.sss.crud.bean.Department;
import jp.co.sss.crud.bean.Employee;
import jp.co.sss.crud.db.DepartmentDAO;
import jp.co.sss.crud.db.EmployeeDAO;
@WebServlet("/Insert")
public class Insert extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String empPass = request.getParameter("empPass");
String empName = request.getParameter("empName");
String gender = request.getParameter("gender");
String address = request.getParameter("address");
String birthday = request.getParameter("birthday");
String authority = request.getParameter("authority");
String deptId = request.getParameter("deptId");
Department department = null;
try {
department = DepartmentDAO.findByDepartment(deptId);
} catch (SQLException e) {
throw new ServletException(e);
}
Employee employee = new Employee();
employee.setEmpPass(empPass);
employee.setEmpName(empName);
employee.setGender(gender);
employee.setAddress(address);
employee.setBirthday(birthday);
employee.setAuthority(authority);
employee.setDepartment(department);
EmployeeDAO.insert(employee);
request.getRequestDispatcher("/jsp/sample01/regist_complete.jsp").forward(request, response);
}
}
package jp.co.sss.crud.db;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import jp.co.sss.crud.bean.Department;
import jp.co.sss.crud.bean.Employee;
public class EmployeeDAO {
/**
*         社員を登録
*          
*         @return 社員登録
*         @throws SQLException
*                     データベース操作失敗時に送出
*         */
*         public static void insert(Employee employee) {
*         Connection con = null;
*         PreparedStatement ps = null;
try {
con = DBManager.getConnection();
ps = con.prepareStatement("INSERT INTO EMPLOYEE(EMP_PASS,EMP_NAME,"
+ "GENDER,ADDRESS,BIRTHDAY,AUTHORITY,DEPT_ID)VALUES(?, ?, ?, ?, ?, ?, ?)");
ps.setString(1, employee.getEmpPass());
ps.setString(2, employee.getEmpName());
ps.setString(3, employee.getGender());
ps.setString(4, employee.getAddress());
ps.setString(5, employee.getBirthday());
ps.setString(6, employee.getAuthority());
ps.setString(7, employee.getDepartment().getDeptId());
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBManager.close(ps, con);
}
}


DepartmentDAO

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import jp.co.sss.crud.bean.Department;

public class DepartmentDAO {
/**
* 部署情報を部署IDで検索
*
* @param genreId
* 部署ID
* @return 部署情報
* @throws SQLException
* データベース操作失敗時に送出
*/
public static Department findByDepartment(int deptId) throws SQLException {
Department department = null;

Connection connection = DBManager.getConnection();

PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM DEPARTMENT WHERE DEPT_ID = ?");
preparedStatement.setInt(1, deptId);
ResultSet resultSet = preparedStatement.executeQuery();

if (resultSet.next()) {
department = new Department();
department.setDeptId(resultSet.getInt("dept_id"));
department.setDeptName(resultSet.getString("dept_name"));
}

DBManager.close(preparedStatement, connection);

return department;
}

}

HTTPステータス500-というエラーが起き、説明に、The server encountered an internal error that prevented it from fulfilling this request.というのが表示されています。

ps.setString(7, employee.getDepartment().getDeptId());のコードを消すと社員完了画面まではいくのですが、社員登録はされませんでした。
2日間考えたり調べたりしたのですが、解決できなかったので、アドバイス等頂けると大変助かります。
ソースコードが多く、大変ご迷惑だと思いますが、宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Ryo1504

    2019/07/29 10:49

    departmentのdeptidの定義をStringからintに変えて、
    setStringもsetIntに変えたのですが、
    int deptId = request.getParameter("deptId");のところで、
    「型の不一致:Stringからintには変換できません」というエラーがでます。

    下記はdepartmentのbeanです。

    package jp.co.sss.crud.bean;

    /**
    * 部署情報Bean
    *
    * @author system_shared
    */
    public class Department {
    /** 部署ID */
    private int deptId;

    /** 部署名 */
    private String deptName;

    /**
    * 部署IDを取得
    *
    * @return 部門ID
    */
    public int getDeptId() {
    return deptId;
    }

    /**
    * 部門IDを保存
    *
    * @param deptId
    * 部門ID
    */
    public void setDeptId(int deptId) {
    this.deptId = deptId;
    }

    /**
    * 部門を取得
    *
    * @return 部門名
    */
    public String getDeptName() {
    return deptName;
    }

    /**
    * 部門名を保存
    *
    * @param deptName
    * 部門名
    */
    public void setDeptName(String deptName) {
    this.deptName = deptName;
    }

    }

    キャンセル

  • m.ts10806

    2019/07/29 10:58

    そりゃそうなります。
    もう少し型の概念をきちんと学んだほうが良いです。

    キャンセル

  • Ryo1504

    2019/07/29 11:25

    型の概念を復習し、自分なりに考えたのですが、よく分かりませんでした。
    大変恐縮ではあるのですが、具体的にどう直せばよいのか教えていただけないでしょうか?
    宜しくお願い致します。

    キャンセル

回答 2

+1

employee.getDepartment().getDeptId()が何をしているのか分かりませんが、値が返却されていないのでしょう。

それをコメントにした場合、employeeのdept_idはNot Null制約ですのでエラーが発生して登録されないはずです。

そもそも登録する際にはdept_idは決定されていないとおかしいのではないですか?
なので、作り的には、employee.getDeptId()を指定するんじゃないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/29 12:14

    アドバイスありがとうございます。
    早速試してみたのですが、@WebServlet("/Check")のint deptId = request.getParameter("deptId");で、
    「型の不一致:Stringからintには変換できません」というエラーがでます。
    deptIdの型はintにはしています。

    キャンセル

  • 2019/07/29 12:38 編集

    mst10806さんも言われているように検索されてみてはどうですか。
    「java stirng int」で検索すると、以下の様な記事が見つかります。
    [あえて言うほどではない 数値 ⇔ 文字列変換 Java編]https://www.techscore.com/blog/2012/11/28/%E6%95%B0%E5%80%A4-%E2%87%94-%E6%96%87%E5%AD%97%E5%88%97%E5%A4%89%E6%8F%9B-java%E7%B7%A8/

    キャンセル

  • 2019/07/29 13:08

    ありがとうございます。
    参考にさせて頂きます。

    キャンセル

0

おかしいところはDBの数値型カラムに対してsetString()してるところくらいしか見当たりませんが、departmentのdeptidの定義も確認してください。
数値型におさめるなら変数の定義も数値型にしておくべきですね。

int deptId = request.getParameter("deptId");

入力パラメータは型としては基本的に全て文字列型となります。
ですので、Java側で変数として別の型で受ける場合、適切に変換してあげる必要があります。
検索ワードは「言語名 変換元の型 変換先の型」です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/29 14:30

    employeeのdeptIdはbeanでint型と宣言しました。
    下記はDepartmentDAOのコードです。
    package jp.co.sss.crud.db;

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;

    import jp.co.sss.crud.bean.Department;

    public class DepartmentDAO {
    /**
    * 部署情報を部署IDで検索
    *
    * @param genreId
    * 部署ID
    * @return 部署情報
    * @throws SQLException
    * データベース操作失敗時に送出
    */
    public static Department findByDepartment(int deptId) throws SQLException {
    Department department = null;

    Connection connection = DBManager.getConnection();

    PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM DEPARTMENT WHERE DEPT_ID = ?");
    preparedStatement.setInt(1, deptId);
    ResultSet resultSet = preparedStatement.executeQuery();

    if (resultSet.next()) {
    department = new Department();
    department.setDeptId(resultSet.getInt("dept_id"));
    department.setDeptName(resultSet.getString("dept_name"));
    }

    DBManager.close(preparedStatement, connection);

    return department;
    }

    }

    キャンセル

  • 2019/07/29 14:32

    こちらに書かれても全員の目につくわけではないので、
    質問要件につながる情報は全て質問本文に追記してください。
    あと、「確実にデータが設定されているか」もデバッグしてください。

    キャンセル

  • 2019/07/29 14:38

    分かりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る