Kseigo_KS
@Kseigo_KS (Kondo Seigo)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

初歩【SpringBoot】DBの情報を一覧表示したい

解決したいこと

JavaのSpringBootでユーザ情報をデータベースに登録し、その情報を一覧表示できるWebアプリを作成中です。
データを追加することはできましたが、一覧を表示するためのコードを書いたところ、表示されず困っている状態です。
解決方法を教えて下さい。

該当するソースコード

一覧表示するためのhtmlファイル
【greeting.html】

<div>
    <h2>ユーザ管理画面</h2>
    <table>
        <thead>
        <tr>
            <th>ユーザID</th>
            <th>ユーザ名</th>
            <th>ユーザ年齢</th>
        </tr>
        </thead>
        <tbody>
        <tr th:each="account: ${users}">
            <td th:text="${account.userId}"></td>
            <td th:text="${account.userName}"></td>
            <td th:text="${account.userAge}"></td>
        </tr>
        </tbody>
    </table>
</div>

Controllerクラス
【HomeController.java】

@Controller
public class HomeController {
    private TaskListDao dao;

    @Autowired
    HomeController(TaskListDao dao) {
        this.dao = dao;
    }

    record Users(String id, String name, String age) {}

    @GetMapping("/greeting")
    public String greeting(Model model) {
        List<Users> users = dao.find();
        model.addAttribute("account", users);
        return "greeting";
    }

    @GetMapping("/test")
    public String test(@RequestParam("name") String name, @RequestParam("age") String age, Model model) {
        String id = UUID.randomUUID().toString().substring(0,8);
        Users u = new Users(id,name, age);
        dao.userAdd(u);
        model.addAttribute("user_id", u.id());
        model.addAttribute("user_name", u.name());
        model.addAttribute("user_age", u.age());
        return "greeting";
    }
}

SQL操作のためのDAOクラス
【TaskListDao.java】

@Service
public class TaskListDao {
    private final JdbcTemplate jdbcTemplate;

    @Autowired
    TaskListDao(JdbcTemplate jdbcTemplate) {

    public int userAdd(Users u) {
        int insert=  jdbcTemplate.update("INSERT INTO Account" + "(userId,userName,userAge) VALUES(?,?,?)",u.id(),u.name(), u.age());
        return insert;
    }

    public List<Users> find() {
        String sql = "SELECT * FROM ACCOUNT";
        List<Map<String, Object>> result = jdbcTemplate.queryForList(sql);
        List<Users> users = result.stream()
                .map((Map<String, Object> row) -> new Users(
                        row.get("userId").toString(),
                        row.get("userName").toString(),
                        row.get("userAge").toString()))
                .toList();
         return users;
    }
}

自分で試したこと

データをINSERTする際にエラーは発生せず、h2-console画面でもデータが格納されていることを確認済みです。
また、TaskListDaoクラスでもstreamを使用し、mapメソッドでSQL情報をGETしString型にキャストしていますが、Controllerクラスからhtmlファイルへのデータの受け渡しができていないのではないかと考えております。
書籍を読みながら自分でユーザの登録部分については実装中ですが、なぜ表示されないかがさっぱりです。
ぜひ、ご教授願います。

0

1Answer

model.addAttribute("account", users);

accountという名前で保存しているのに

<tr th:each="account: ${users}">

usersという名前で取り出しているのが原因では?

1Like

Comments

  1. @Kseigo_KS

    Questioner

    ご回答ありがとうございます。
    thymeleafの書き方が間違っていたため、修正し再度実行すると例外が発生しました。
    「EL1008E: Property or field 'userId' cannot be found on object of type 'com.seigo_demo.HomeController$Users' - maybe not public or not valid?」
    という内容ですが、userIdのフィールドはfind()にも記述したとおり、存在している認識です、、

  2. EL1008E: Property or field 'userId' cannot be found on object of type 'com.seigo_demo.HomeController$Users' - maybe not public or not valid?についての直接的な回答です:
    おそらくUsersエンティティにgetterがないことです。(例:getUserId()メソッド)

    英語によるエラーメッセージと日本人の感覚とは多少のずれがあるのでこの点はある程度なれ・経験が必要かもしれません。
    この場合のcannot be foundはThymeleafのエンジンがUsersエンティティのフィールドuserIdを探しに行った結果です。
    Javaに於いてクラスのフィールドを「探す」という行為は、「参照する」と言い換えられます。
    なので、参照できなかった=見つからなかったとなります。
    つまり、ThymeleafのエンジンがUsersエンティティのuserIdフィールドを参照できるようにするため、
    getterを用意する必要があります。

    なお、本旨とはずれますが、Lombokを使用している場合は、Usersエンティティに@Getterアノテーションを付与するだけで機能します。

    学習したばかりの時は覚えることも多く、またエラーメッセージの意図するところも汲み取りにくいかと思います。
    根気よく続けていくと慣れていくと思いますので、引き続き頑張ってください。

  3. @Kseigo_KS

    Questioner

    大変わかりやすくご説明いただき、ありがとうございます。
    確かにエラー内容を調べていくと、getterがないことまでは分かったのですがrecordを使用しているため、「参照できない」に辿り着けませんでした。
    実際にコード内容を修正したところ、期待する動作になりました。
    Lombokは未だ使用したことはありませんが、ライブラリも積極的に取り入れて学習していきたいと考えております。

Your answer might help someone💌