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

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

ただいまの
回答率

89.64%

原因のわからないコンパイルエラーがでています。

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 446

usako

score 25

前提・実現したいこと

閲覧いただき、ありがとうございます。
Eclipse,Springを使ってJAVAの勉強をしている(超)初心者です。
元々eclipse4.5 Marsで開発していた資産をeclipse2018-09に
アップデートしたのですが、以下のようなエラーが出ています。
ネットで調べても、参考になる情報が見当たらず困っています。
どなたかご教示いただけないでしょうか。 

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

型 RowMapper は総称ではありません。引数 <Employee> でパラメーター化できません。
イメージ説明]

該当のソースコード

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

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

import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
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 INSERT  = "insert";
    private static final String DELETE  = "delete";
    private static final String INIMSG = "従業員番号を入力してください";
    private static final String REFMSG = "情報が取得できました";
    private static final String UPDMSG = "情報を更新してください";
(省略)
    private RecordManager recordManager;

    private DepartmentInfoGet departmentInfoGet;
    public AddressBookController(RecordManager recordManager,DepartmentInfoGet departmentInfoGet) {
        this.recordManager = recordManager;
        this.departmentInfoGet = departmentInfoGet;
    }
    @RequestMapping(value = "/start")
    public String init(AddressBookForm form, Model model) {
        model.addAttribute("message", INIMSG);
        return INIT;
    }

    @RequestMapping(params = "reference")  //参照
    public String refer(@Valid AddressBookForm form, BindingResult result, Model model) {
        if (result.hasErrors()) {
            return INIT;
        }

        List<Map<String, Object>> departmentList = departmentInfoGet.getDepartmentList();
        model.addAttribute("departmentList", departmentList);

        Employee employee = recordManager.selectEmployee(form.getId());
        if (employee != null) {
            form.setName(employee.getName());
            form.setPhone(employee.getPhone());
            form.setAddress(employee.getAddress());
            form.setKana(employee.getKana());
            form.setSex(employee.getSex());
            form.setDepartment(employee.getDepartment());
            model.addAttribute("message", REFMSG);
            return REFER;
        } else {
            model.addAttribute("message", ERRMSG);
            return INIT;
        }
    }
(省略)
(RecordManager.java)
package jp.practice.address;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import javax.swing.tree.RowMapper;

import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
//*start ***/
@Component
//*e n d ***/
public class RecordManager {
    private JdbcTemplate jdbcTemplate;
    public  RecordManager(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    /**
     * 指定したID のレコードを取得
     *
     * @param id
     *            従業員番号
     * @return Employee
     */

/**start
 * @param name ****/
    public Employee selectEmployee(String id) {

        try{
            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("","","","","",0,0);
                        employee.setId(rs.getString("id"));
                        employee.setName(rs.getString("name"));
                        employee.setPhone(rs.getString("tel"));
                        employee.setAddress(rs.getString("address"));
                        employee.setKana(rs.getString("kana"));
                        employee.setSex(rs.getInt("sex"));
                        employee.setDepartment(rs.getInt("department_cd"));
                        return employee;
                    }
            });
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }

    /**
     * 指定した従業員情報を反映
     *
     * @param emp
     *            従業員情報
     */
    public int updateEmployee(String id,String name,String kana, String phone, String address, int sex, int department){
        try{
            return jdbcTemplate.update("update unit02.addressbook set name = ? , kana = ? , tel = ?, address = ?, sex = ? ,department_cd = ? where id = ? ",
                    new Object[]{ name , kana , phone , address, sex, department, id });
        } catch (IncorrectResultSizeDataAccessException e) {
            System.out.println("data incorrect ERR");
            return 0;
        }
    }
    public int insertEmployee(String id,String name, String kana,String phone, String address, int sex, int department){
        try{
            return jdbcTemplate.update("insert unit02.addressbook value (? , ? ,? , ? , ? , ? ,?) ",
                       new Object[]{ id, name , kana , phone , address, sex, department });
        } catch (IncorrectResultSizeDataAccessException e) {
            System.out.println("data incorrect ERR");
            return 0;
        }
    }
    public int deleteEmployee(String id){
        try{
            return jdbcTemplate.update("delete from unit02.addressbook where id = ? ",
                    new Object[]{ id });
        } catch (IncorrectResultSizeDataAccessException e) {
            System.out.println("data incorrect ERR");
            return 0;
        }
    }
    public List<Map<String, Object>> getEmployeeList() {
        List<Map<String, Object>> list = jdbcTemplate.queryForList("select a.id,a.name,a.kana,d.name as departmentname,a.tel,a.address,a.sex from unit02.addressbook as a  left join unit02.department as d on a.department_cd = d.cd order by id");
    return list;
    }
}
(Employee.java)
package jp.practice.address;

public class Employee {

    private String id;
    private String name;
    private String phone;
    private String address;
    private String kana;
    private int sex;
    private int department;
    /**
     * @param id
     * @param name
     * @param kana
     * @param phone
     * @param address
     * @param sex
     * @param department
     */
    public Employee(String id, String name, String kana, String phone, String address, int sex, int department) {
        this.id = id;
        this.name = name;
        this.phone = phone;
        this.address = address;
        this.kana = kana;
        this.sex = sex;
        this.department = department;
    }
    /**
     * @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;
    }
    /**
     * @return kana
     */
    public String getKana() {
        return kana;
    }
    /**
     * @param kana セットする kana
     */
    public void setKana(String kana) {
        this.kana = kana;
    }
    /**
     * @return sex
     */
    public int getSex() {
        return sex;
    }
    /**
     * @param sex セットする address
     */
    public void setSex(int sex) {
        this.sex = sex;
    }
    /**
     * @return department
     */
    public int getDepartment() {
        return department;
    }
    /**
     * @param department セットする address
     */
    public void setDepartment(int department) {
        this.department = department;
    }
    /* (非 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;
    }
}

試したこと

①javac -version でjavaのコンパイル環境を確認。⇒11.0.2
②eclipse>ウィンドウ>設定>java>コンパイラー>コンパイラー準拠レベルを確認⇒1.8
③①と②の同期がとれているかよく分からなかったため、②の準拠レベルを11(BETA)に変更し、フルビルドを行ったが、結果変わらず。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • y_waiwai

    2019/09/02 17:36

    そのままビルドを行うとエラーメッセージが出てきます。それをそのままコピーして、追記してくれませんか。
    質問は編集できます

    キャンセル

  • usako

    2019/09/03 11:06

    y_waiwai様、ご回答ありがとうございます。
    >そのままビルドを行うとエラーメッセージが出てきます。
    eclipse>プロジェクト>自動的にビルドを解除して、プロジェウトのビルドを選択しても、エラーメッセージがコンソールに表示されません(泣)何か設定がおかしいのでしょうか。今後のこともあるので、お手数でなければお教えいただけるとありがたいのですが。

    キャンセル

  • y_waiwai

    2019/09/03 11:13

    実際のコンパイルでエラーが出ないってことはそのメッセージは誤判定か警告メッセージか、でしょうか。
    Eclipseのコード入力時のエラー表示というのはビルドシステムとは別でEclipseが解析して出してますんで、環境のちょっとした違いなどで誤判定がよくでます。
    まあ、ビルドして問題ないなら無視して構わないと思いますが。

    キャンセル

  • usako

    2019/09/03 11:21

    y_waiwai様、早々のご回答ありがとうございます。
    >誤判定か警告メッセージか、でしょうか。
    警告ではなくエラーでした。結局xebmeさまにご教授いただいたようにimport文を修正したところ、エラーは解除できたのですが、元々古いバージョンで動作していたソースのため、import文を修正してエラーが解除できたのは、不思議な気がします。

    キャンセル

回答 1

checkベストアンサー

+1

stackoverflow
stackoverflowを見たらそれらしい問題解決がでていました。Spring 3.1.2 RowMapper parameterization

原因はeclipseが別のRowMapperをimportをしているから。

import javax.swing.tree.RowMapper;


このimportを以下に書き換える。

import org.springframework.jdbc.core.RowMapper;

これで解決しなければ、Springのバージョン情報やMavenの設定情報が必要です。

参考
The type RowMapper is not generic; it cannot be parameterized with arguments <User>
Interface RowMapper<T>

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/09/10 11:20

    xebmeさま、ご回答ありがとうございます。
    >推測ですが、pom.xmlの依存関係の評価が変わったかもしれません。
    なるほど。Eclipseのバージョンが上がったことによる変化ということでしょうか。
    >可能なら、RowMapper<T>だけのソースを使ってMars環境でビルドすることをおすすめします。
    ご教授ありがとうございます。今すぐは無理そうですが試してみたいと思います。

    キャンセル

  • 2019/09/10 18:23

    あくまでも推測ですから。時間があれば情報収集してみます。

    キャンセル

  • 2019/09/11 09:06

    xebmeさま、何度もご回答ありがとうございます。
    >時間があれば情報収集してみます。
    ありがとうございます!色々勉強になります。

    キャンセル

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

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