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

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

ただいまの
回答率

89.71%

参照画面を作成していますが、コンパイルエラーがとれません・・・

解決済

回答 2

投稿 編集

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

usako

score 25

前提・実現したいこと

閲覧いただき、ありがとうございます。
Eclipse,Springを使ってJAVAの勉強をしている(超)初心者です。
元々、受講していた通信教育の課題がDBを使用しておらず、
内部にテーブルを保持している構造だったので、それを
MySQL,JDBCで外部化しようとしています。
一覧表示、更新、参照機能だけのシンプルな画面です。
内部テーブルを参照していたところを、DBに問合わせするよう
修正しているのですが、コンパイルエラーがとれません。
無理やりキャストするとコンパイルは通るのですが、
ClassCastExceptionが発生してしまいます。
根本的にロジックが間違っているのかもしれないのですが、
どこがどうおかしいのかもわかりません。
どなたかご教示いただけないでしょうか。

発生している問題・エラーメッセージ

AddressBookController.javaの★の個所でコンパイルエラーと
なります。
メソッドgetName()型List<Map<String,Object>>で未定義です
メソッドgetPhone()型List<Map<String,Object>>で未定義です
メソッドgetAddress()型List<Map<String,Object>>で未定義です

該当のソースコード

(AddressBookController.java)
package jp.practice.address;

import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping(value = "/book")
public class AddressBookController {
    private static final String INIT   = "init";
    private static final String REFER  = "refer";
    private static final String UPDATE = "update";
    private static final String LIST   = "list";
    private static final String INIMSG = "従業員番号を入力してください";
    private static final String REFMSG = "情報が取得できました";
    private static final String UPDMSG = "情報を更新してください";
    private static final String ERRMSG = "該当するデータはありません";

    private RecordManager recordManager;
    public AddressBookController(RecordManager recordManager) {
        this.recordManager = recordManager;
    }

    @RequestMapping(value = "/start")
    public String init(AddressBookForm form, Model model) {
        model.addAttribute("message", INIMSG);
        return INIT;
    }

    @RequestMapping(params = "reference")
    public String refer(AddressBookForm form, Model model) {
//*start ***
        List<Map<String, Object>> list1 = recordManager.selectEmployee(form.getId());
        if (list1 != null) {
★            form.setName(list1.getName());
★            form.setPhone(list1.getPhone());
★            form.setAddress(list1.getAddress());
//        Employee employee = RecordManager.selectEmployee(form.getId());
//        if (employee != null) {
//            form.setName(employee.getName());
//            form.setPhone(employee.getPhone());
//            form.setAddress(employee.getAddress());
//*e n d
            model.addAttribute("message", REFMSG);
            return REFER;
        } else {
            model.addAttribute("message", ERRMSG);
            return INIT;
        }
    }

    ----------割愛--------------

    @RequestMapping(params = "toInit")
    public String toInit(AddressBookForm form, Model model) {
        model.addAttribute("message", INIMSG);
        return INIT;
    }
}
(AddressBookForm.java))
package jp.practice.address;

public class AddressBookForm {

    private String id;
    private String name;
    private String phone;
    private String address;

    public AddressBookForm() {
    }
    /**
     * @return id
     */
    public String getId() {
        return id;
    }
    /**
     * @param id セットする id
     */
    public void setId(String id) {
        this.id = id;
    }
    /**
     * @return name
     */
    public String getName() {
        return name;
    }
    /**
     * @param name セットする name
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * @return phone
     */
    public String getPhone() {
        return phone;
    }
    /**
     * @param phone セットする phone
     */
    public void setPhone(String phone) {
        this.phone = phone;
    }
    /**
     * @return address
     */
    public String getAddress() {
        return address;
    }
    /**
     * @param address セットする address
     */
    public void setAddress(String address) {
        this.address = address;
    }
}
(Employee.java)
package jp.practice.address;

public class Employee {

    private String id;
    private String name;
    private String phone;
    private String address;

    /**
     * @param id
     * @param name
     * @param phone
     * @param address
     */
    public Employee(String id, String name, String phone, String address) {
        this.id = id;
        this.name = name;
        this.phone = phone;
        this.address = address;
    }
    /**
     * @return id
     */
    public String getId() {
        return id;
    }
    /**
     * @param id セットする id
     */
    public void setId(String id) {
        this.id = id;
    }
    /**
     * @return name
     */
    public String getName() {
        return name;
    }
    /**
     * @param name セットする name
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * @return phone
     */
    public String getPhone() {
        return phone;
    }
    /**
     * @param phone セットする phone
     */
    public void setPhone(String phone) {
        this.phone = phone;
    }
    /**
     * @return address
     */
    public String getAddress() {
        return address;
    }
    /**
     * @param address セットする address
     */
    public void setAddress(String address) {
        this.address = address;
    }
    /* (非 Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }
    /* (非 Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof Employee)) {
            return false;
        }
        Employee other = (Employee) obj;
        if (id == null) {
            if (other.id != null) {
                return false;
            }
        } else if (!id.equals(other.id)) {
            return false;
        }
        return true;
    }
}
(RecordManager.java)
package jp.practice.address;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@Component
public class RecordManager {
    private JdbcTemplate jdbcTemplate;

//    /** 初期値データ */
    private static List<Employee> list = new ArrayList<>();
    static {
    }
    public  RecordManager(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
    /**
     * 指定したID のレコードを取得
     *
     * @param id
     *            従業員番号
     * @return Employee
     */

/**start ****/
//    public static Employee selectEmployee(String id) {
    public List<Map<String, Object>> selectEmployee(String id) {
        System.out.println("step1");
        List<Map<String, Object>> list1 = jdbcTemplate.queryForList("select * from unit02.addressbook where id = '200101'");
        System.out.println("step2");
        System.out.println("list1=" + list1);
        return list1;
//        int index = list.indexOf(new Employee(id, "", "", ""));
//        if (index < 0) {
//            return null;
//        }
//        return list.get(index);
/**e n d*/
    }

    /**
     * 指定した従業員情報を反映
     *
     * @param emp
     *            従業員情報
     */
    public static void updateEmployee(Employee emp) {
        int index = list.indexOf(emp);
        list.set(index, emp);
    }
    public List<Map<String, Object>> getEmployeeList() {
        List<Map<String, Object>> list1 = jdbcTemplate.queryForList("select * from unit02.addressbook order by id");
    return list1;
    }
}

試したこと

クイック・フィックス機能で(Employee)や(AddressBookForm)にキャスト
してみましたが、実行時にClassCastExceptionが発生してしまいます。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

id, name, phone, address を Employee で纏めて扱おうとされているのに, RecordManager のメソッドは結果を List<Map<String, Object>> で返す等, ちぐはぐです.

selectEmployee が Employee を返す宣言がコメント化されていることを見ますと, 元は Employee だった返り値を, jdbcTemplate.queryForList が List を返すからと変更されたのでは無いでしょうか.

このような場合は宣言を変えずにメソッド内でその変化を吸収するようにしなければ, 折角動作していたコードをあちこち直すことになり, ごちゃごちゃになり易いかと思います.

id によって SELECT が 0~1件しか結果を返さないのでしたら, List にも 0~1件しか入っていませんので, それを取り出して Employee に詰め直し, 返り値として戻せば良いと思います.

いっそ queryForObject を使うようにしてみました. なお, コンパイルもしていませんので, ご参考までに.

  public Employee selectEmployee(String id) {
    return jdbcTemplate.queryForObject("select * from unit02.addressbook where id = ?",
      new Object[]{ id },
      new RowMapper<Employee>() {
        @Override
        public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
          Employee employee = new Employee();
          employee.setId(rs.getString("id"));
          employee.setName(rs.getString("name"));
          employee.setPhone(rs.getString("phone"));
          employee.setAddress(rs.getString("address"));
          return employee;
        }
      });
  }

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/31 17:20

    『このコードのObject配列のように』はその後の『一瞬しか必要ない場合は』に付けたものですので, お察しの通り, new Object[]{ id } は変数には入っていません.

    キャンセル

  • 2019/05/31 17:24

    なるほど。すっきりしました。何度も返信をしてくださって感謝しています。
    ありがとうございました。

    キャンセル

  • 2019/05/31 17:42

    いえいえ, 私の書いたものに対するご質問なら, 私が答えるのが正道ですので.
    お疲れさまでした.

    キャンセル

+1

list1 の型が、Employeeではないです。
List<Map<String, Object>>型です。

ですので、Employeeクラスで定義している
メソッド getName()、getPhone()、getAddress()は、list1では未定義となります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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