2011-11-07 10 views
0

オブジェクトのListを反復しようとしています。以下のような..だからPlay-Framework:ClassCastExceptionが発生しました:java.util.LinkedHashMapをmodels.Systemsにキャストできません

for(System s : usersSystems){ 

} 

どこusersSystemsはタイプList<UserSystems>です。 usersSystemsは、単にコンストラクタからなる非常に単純なクラスです... usersSystemsを割り当て

public UsersSystems(System system,int ID) { 
    this.system = system; 
    this.ID = ID; 
} 

は初期化され、Userコンストラクタでデフォルト値が与えられuser.sourcesにそれが等しくすることによって行われます。以下は私のスタックトレースです。上記のエラーが発生するのはなぜですか?それを修正するにはどうすればよいですか?

play.exceptions.JavaExecutionException: java.util.LinkedHashMap cannot be cast to models.Systems 
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:227) 
at Invocation.HTTP Request(Play!) 
Caused by: java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to models.Systems 
at controllers.Start.starting(Start.java:40) 
at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:540) 
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:498) 
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:474) 
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:469) 
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:157) 
... 1 more 

EDIT:

UserSystem

@Entity 
public class UsersSystem extends Model{ 

public int ID; 
public System system; 

public UsersSystem(System system, int ID) { 
    this.source = source; 
    this.ID = ID; 
} 

} 

SYSTEM

@Entity 
public class System extends Model{ 

private String name; 
private int ID; 

public System(String name, int ID){ 
    this.name = name; 
    this.ID = ID; 
} 

} 
+1

あなたのリストには、システムインスタンスが含まれていると最初に言います。次に、Systemはコンストラクタを持つシンプルなクラスであり、SystemではなくUserSystemsという名前のクラスのコンストラクタを表示します。最後に、あなたのリストには、例外に応じてLinkedHashMapインスタンスが含まれ、それをシステムにキャストしようとします(最終的に)。それは4つの異なるタイプになります。あなたはあなたのタイプと非常に混同されているようです。また、リストをインスタンス化して入力するコードを見ることなく、エラーがどこにあるかを伝えることは不可能です。 –

+0

@JBNizet Woops!私はうまくいけば、これはより理にかなって私の質問を明らかにした。 – user596186

+0

私たちにコードを教えてください。 SystemではUsersSystemsが拡張されていますか?もしそうでなければ、あなたが示したコードはコンパイルすべきではないからです。 –

答えて

1

まず第一に、プレイフレームを使用してあなたのモデルでIDを指定する必要はありません。 Playフレームワークによって自動的にIDが追加されます。次に、1対1マッピングを指定する必要があります。

私はコンストラクタも変更しました。 source変数はどこから来たのですか?

@Entity 
public class UsersSystem extends Model{ 

    @OneToOne 
    public System system; 

    public UsersSystem(System system) { 
    this.system = system; 
    } 

} 

フィールドは、公開とマークする必要があります。

@Entity 
public class System extends Model{ 

    public String name; 

    public System(String name){ 
    this.name = name; 
    } 

} 

リストを反復処理、あなたが正しい種類を使用していることを確認してください。 は今、あなたのループは(usersSystemsを仮定すると、タイプList<UsersSystem>である)のようになります。

for(UsersSystem us : usersSystems){ 
    System.out.println("The system name is " + us.system.name); 
} 

プレイFrameworkが良いドキュメントを持っています。 http://www.playframework.org/documentation

関連する問題