QA@IT

Application.java コンパイルERROR 「 シンボルを見つけられません」の意味が解りません。

7419 PV

@ITの記事「Play frameworkのDB操作を楽にするEBeanの基礎知識 (2/3)」についての質問です。


記事の中で、

SELECT

 Play frameworkでは、検索を行う「play.db.ebean.Model.Finder」クラスが用意されています。このクラスを使うには、以下のようにFinderオブジェクトを作成します。

Finder<Long, Parent> finder = new Finder<Long, Parent>(Long.class, Parent.class);

■上記にて、eclipseで、play.db.ebean.Modelを探して、Finderオブジェクトを作成する必要があるのでしょうか?


コンパイルエラーです。

■「WEBブラウザです。」

Compilation error
エラー: シンボルを見つけられません
In C:\play-2.2.3\firstProject\app\controllers\Application.java at line 19.
16        Parent.class);
17
18      // parent1 の取得(条件を指定した検索)
19        Query<Parent> query = finder.where("name='新宿太郎'");

20        Parent parent1 =query.findUnique();
21 
22        // parent2 の取得(Idからの検索。Idは保存したときに振られたId)
23        Parent parent2 =finder.byId(new Long(2));
24 

■コマンドプロンプトのERROR出力です。

[info] Loading project definition from C:\play-2.2.3\firstProject\project
[info] Set current project to firstProject (in build file:/C:/play-2.2.3/firstProject/)

--- (Running the application from SBT, auto-reloading is enabled) ---

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

[info] Compiling 1 Java source to C:\play-2.2.3\firstProject\target\scala-2.10\classes...
[error] C:\play-2.2.3\firstProject\app\controllers\Application.java:19: エラー: シンボルを見つけられません
[error]         Query<Parent> query = finder.where("name='新宿太郎'");
[error]         ^
[error]   シンボル:   クラス Query
[error]   場所: クラス Application
[error] C:\play-2.2.3\firstProject\app\controllers\Application.java:33: エラー: 変数 finderはすでにメソッド index()で定義されています
[error]         Finder<Long, Parent> finder = new Finder<Long, Parent>(Long.class,
[error]                              ^
[error] エラー2個
[error] Picked up _JAVA_OPTIONS: "-Dfile.encoding=SJIS"
[error] (compile:compile) javac returned nonzero exit code
[error] application - 

! @6jjhhbj66 - Internal server error, for (GET) [/] ->

play.PlayExceptions$CompilationException: Compilation error[エラー: シンボルを見つけられません]
    at play.PlayReloader$$anon$1$$anonfun$reload$2$$anonfun$apply$14$$anonfun$apply$16.apply(PlayReloader.scala:304) ~[na:na]
    at play.PlayReloader$$anon$1$$anonfun$reload$2$$anonfun$apply$14$$anonfun$apply$16.apply(PlayReloader.scala:304) ~[na:na]
    at scala.Option.map(Option.scala:145) ~[scala-library.jar:na]
    at play.PlayReloader$$anon$1$$anonfun$reload$2$$anonfun$apply$14.apply(PlayReloader.scala:304) ~[na:na]
    at play.PlayReloader$$anon$1$$anonfun$reload$2$$anonfun$apply$14.apply(PlayReloader.scala:298) ~[na:na]
    at scala.Option.map(Option.scala:145) ~[scala-library.jar:na]
[warn] play - No application found at invoker init

[success] Total time: 52 s, completed 2014/09/25 20:56:06

コマンドプロンプトのERRORが文字化け無しで見られるようになりましたので、張り替えました。

  • マークダウンを修正しました?とはどういう意味なのでしょうか?赤と緑の色の違いは?+とーの使い分けの意味は? -
  • http://qa.atmarkit.co.jp/docs/markdown こちらのドキュメントを見てください(マークダウン)。 + (緑部分)は追加された行です。 - (赤部分)は削除された行です(内容変更時も 削除→追加 という扱いになるので、単純に消しただけとは限りません)。 -

回答

エラーログ上、^で示されているキーワードが解決できない(コンパイルする上でソースやライブラリを発見できない)という意味です。

今回で言えばコマンドプロンプトのエラーで出ているQueryだとかですね。
importなどがたりなくて、クラスを見つけられない場合などにも起こります。

以前と同様Play Frameworkのバージョンの違いによるかもしれません。

質問投稿時の注意書きにも書いてありますが、ログやソースなどは、``` でくくると崩れずに表示できますので活用してください。

編集 履歴 (0)
  • コマンドプロンプトのERRORが文字化け無しで見られるようになりましたので、張り替えました。(前回教えていただいた、play run の前のSJIS指定の一行です。) -
  • ■以下の行が抜けていました。
    import com.avaje.ebean.Query;
    -
  • ■import文を追加する修正を行い。
    ■省略されていた行を修正した。
    上記2つの修正を行ったらコンパイルエラーは、出なくなり、正常に実行できました。ありがとう御座いました。
    -

まだ解決されていない場合、

importなどがたりなくて、

というヒントを挙げましたが、import部分の見直しや確認はされましたか?

記事の中の
「次に、parent1のnameを変更し、parent2を削除してみましょう。先ほどのApplication.javaを下記のように修正してください。」
のコードでは

import com.avaje.ebean.Query;

が追加されています。


疑問として挙がっている、「Finderオブジェクトを作成する必要があるか」ですが、
Finderオブジェクトは既に存在します(というかレコードを追加した時のコードで使用しています)。

エラーが起きていたからそう思われていたのかもしれませんが、
コンソールに一緒に出力されている別のエラー (「finderは別の場所で定義されています」)
に関しては、記事の方の確認漏れですね。

        // 現在のParentを全検索して表示
……【略】……

となっていますが、そのまま元のコードを移植するとこのコメントの次の行で

        // 現在のParentを全検索して表示
        Finder<Long, Parent> finder = new Finder<Long, Parent>(Long.class,
                Parent.class);

となります。
しかし finderという変数はこのメソッドの一番最初(// 検索クラスというコメントの下)で、宣言されていますのでこの行はエラーとなります。

ですので、省略部分は

        // 現在のParentを全検索して表示
        finder = new Finder<Long, Parent>(Long.class,
                Parent.class);
        List<Parent> parents = finder.all();

        StringBuilder msg = new StringBuilder();
        for (Parent parent : parents) {
            msg.append(parent.toString()).append("\n");
        }
        return ok(msg.toString());

としてください。

編集 履歴 (1)
ウォッチ

この質問への回答やコメントをメールでお知らせします。