QA@IT

Child.java でコンパイルエラーが出る。

5837 PV

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

■ブラウザ

Compilation error
エラー: パッケージcom.avaje.ebean.validationは存在しません
In C:\play-2.2.3\firstProject\app\models\Child.java at line 14.
11import play.db.ebean.Model;
12 
13import com.avaje.ebean.annotation.CreatedTimestamp;
14import com.avaje.ebean.validation.NotNull;

15 
16@Entity
17public class Child extends Model {
18 
19    @Id

■コマンドプロンプト

[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 2 Java sources to C:\play-2.2.3\firstProject\target\scala-2.10\classes...
[error] C:\play-2.2.3\firstProject\app\models\Child.java:14: エラー: パッケージcom.avaje.ebean.validationは存在しません
[error] import com.avaje.ebean.validation.NotNull;
[error]                                  ^
[error] C:\play-2.2.3\firstProject\app\models\Parent.java:35: エラー: シンボルを見つけられません
[error]     public List<Child> children = new ArrayList<Child>();
[error]            ^
[error]   シンボル:   クラス List
[error]   場所: クラス Parent
[error] C:\play-2.2.3\firstProject\app\models\Child.java:26: エラー: シンボルを見つけられません
[error]     @NotNull
[error]      ^
[error]   シンボル:   クラス NotNull
[error]   場所: クラス Child
[error] C:\play-2.2.3\firstProject\app\models\Parent.java:34: エラー: シンボルを見つけられません
[error]     @OneToMany(cascade = CascadeType.ALL, mappedBy = "parent") 
[error]      ^
[error]   シンボル:   クラス OneToMany
[error]   場所: クラス Parent
[error] C:\play-2.2.3\firstProject\app\models\Parent.java:35: エラー: シンボルを見つけられません
[error]     public List<Child> children = new ArrayList<Child>();
[error]                                       ^
[error]   シンボル:   クラス ArrayList
[error]   場所: クラス Parent
[error] エラー5個
[error] Picked up _JAVA_OPTIONS: "-Dfile.encoding=SJIS"
[error] (compile:compile) javac returned nonzero exit code
[error] application - 

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

play.PlayExceptions$CompilationException: Compilation error[エラー: パッケージcom.avaje.ebean.validationは存在しません]
    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

■新しいコンパイルエラー

Compilation error
エラー: シンボルを見つけられません
In C:\play-2.2.3\firstProject\app\models\Parent.java at line 35.
32    }
33
34    @OneToMany(cascade = CascadeType.ALL, mappedBy = "parent") 
35  public List<Child>

[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 2 Java sources to C:\play-2.2.3\firstProject\target\scala-2.10\classes...
[error] C:\play-2.2.3\firstProject\app\models\Parent.java:35: エラー: シンボルを見つけられません
[error]     public List<Child> children = new ArrayList<Child>();
[error]            ^
[error]   シンボル:   クラス List
[error]   場所: クラス Parent
[error] C:\play-2.2.3\firstProject\app\models\Parent.java:34: エラー: シンボルを見つけられません
[error]     @OneToMany(cascade = CascadeType.ALL, mappedBy = "parent") 
[error]      ^
[error]   シンボル:   クラス OneToMany
[error]   場所: クラス Parent
[error] C:\play-2.2.3\firstProject\app\models\Parent.java:35: エラー: シンボルを見つけられません
[error]     public List<Child> children = new ArrayList<Child>();
[error]                                       ^
[error]   シンボル:   クラス ArrayList
[error]   場所: クラス Parent
[error] エラー3個
[error] Picked up _JAVA_OPTIONS: "-Dfile.encoding=SJIS"
[error] (compile:compile) javac returned nonzero exit code
[error] application - 

! @6jlnlagfj - 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

■コンパイルエラー解決後のエラーです。

Execution exception
[NullPointerException: null]
In C:\play-2.2.3\firstProject\app\controllers\Application.java at line 28.
25        Parent parent2 =finder.byId(new Long(2));
26      
27      // 1番目の名前を更新します
28        parent1.name = "新宿太郎";
29        parent1.update();
30 
31        // 2番目を削除します
32        parent2.delete();
33 

どこが悪いか解りません。何卒宜しく御願い致します。

■その後のコンパイルエラーです。
■ブラウザーです。

Compilation error
エラー: シンボルを見つけられません
In C:\play-2.2.3\firstProject\app\models\Child.java at line 40.
37                + name + ", createDate=" + createDate + ", updateDate="
38                + updateDate + "]";
39    }
40  Parent parent1 = query.findUnique();

41}

--
■コマンドプロンプト
[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\models\Child.java:40: エラー: シンボルを見つけられません
[error]     Parent parent1 = query.findUnique();
[error]                      ^
[error]   シンボル:   変数 query
[error]   場所: クラス Child
[error] エラー1個
[error] Picked up _JAVA_OPTIONS: "-Dfile.encoding=SJIS"
[error] (compile:compile) javac returned nonzero exit code
[error] application - 

! @6jmhb7can - 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

■Parent.java

package models;

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Version;
import javax.validation.constraints.NotNull;

import javax.persistence.*;
import java.util.*;

import play.db.ebean.Model;

import com.avaje.ebean.annotation.CreatedTimestamp;

@Entity
public class Parent extends Model {

    @Id
    public Long id;

    @NotNull
    public String name;

    @CreatedTimestamp
    public Date createDate;

    @Version
    public Date updateDate;

    public String toString() {
        return "Parent [id=" + id + ", name=" + name + ", createDate="
                + createDate + ", updateDate=" + updateDate + "]";
    }

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "parent") 
    public List<Child> children = new ArrayList<Child>();
}

■child.java

package models;

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Version;

import play.db.ebean.Model;

import com.avaje.ebean.annotation.CreatedTimestamp;
//import com.avaje.ebean.validation.NotNull;

@Entity
public class Child extends Model {

    @Id
    public Long id;

    @ManyToOne
    @JoinColumn(name = "parent_id")
    public Parent parent;

//  @NotNull
    public String name;

    @CreatedTimestamp
    public Date createDate;

    @Version
    public Date updateDate;

    public String toString() {
        return "Child [id=" + id + ", parent.id=" + parent.id + ", name="
                + name + ", createDate=" + createDate + ", updateDate="
                + updateDate + "]";
    }
    Parent parent1 = query.findUnique();
}

質問を新しくし直すことにします。

回答

前回の回答では説明していませんでしたが、@ITの記事は、Play2.0を使って解説されていて、masahiro_ishさんがお使いのバージョンは、2.2.3ということですので、バージョン間の互換の問題で、サンプルのソースコードがそのまま使えないようです。

例えば、下記の記事で、@NotNullが使えなくなったと書かれています。
Play! 2.1 アプリを Play! 2.2 に移行した作業の覚え書き - C Sharpens you up

もしそのままお使いになるのでしたら、com.avaje.ebean.validation.*を使っている箇所はコメントアウトしてください。
今回の例で言うと、Child.javaの14行目(import com.avaje.ebean.validation...)と26行目(@NotNull)をコメントアウトしてみてください。


(追記)
Parent.javaの「エラー:シンボルを見つけられません」は、コンパイラーがそのシンボル(クラス名や変数)を見つけることができないというエラーです。ここでは、シンボルがクラスになっていますので、クラスが見つからないのが原因です。

クラスが見つからない理由はいくつか考えられますが、

  • クラスが定義されていない、もしくはCLASSPATH上に存在しない
  • パッケージ名を省略しているのに、対応するimportが無い(例:Listを使うときにjava.util.Listimportしていない)
  • 誤字のため存在しないクラスを指定している(例:ArrayListと書くべきところでArraylistになっている)

などがあります。

今回の場合は、importが無いのがエラーの原因です。
IDEでコーディングしていれば、追加したコードにimportが必要な場合は自動で追加してくれるので、説明には書いていないのかもしれません。

ということで、下記の2つのimportを追加してください。

import javax.persistence.*;
import java.util.*;

(追記2)

Parent parent1 = query.findUnique();

parent1nullになるのは、DBにデータが存在しないためです。
どれかの手順を飛ばしてしまっているのではないかと思います。

下記の2つを確認してください。

  • DBに「新宿太郎」が登録するされている必要があります。同じ2ページのひとつ前のサンプルで、登録する処理があります。
  • データの登録処理をやっているのにデータが見つからないとしたら、H2DBをファイルモードにしていない可能性があります。1ページ目のmemfileに変えるところを見てみてください。
  • 14行目と26行目はコメントアウトしてコンパイルしました。あたらしいコンパイルエラーがでましたので、見ていただけないでしょうか? -
  • 回答に追記しましたのでご確認ください。 -
  • コンパイルエラー解決後のエラーを書きましたのでよろしく御願い致します。 -
  • 追記2を追加しましたのでご確認ください。
    あと、何かつまずいた場合は、もういちど記事を最初から見直してみてください。
    手順は書いてある通りに1から確実にやらないと、思ったように動作しません。
    -
ウォッチ

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