リモートクライアントからapachecayenneサーバーにselectをクエリすると、次の問題が発生します。
テストの目的で、1つのテーブルから1つの独立したクラスのみを生成しました。cleintクラス(スーパークラスとサブクラス)とServerクラスを生成しました。カイエンのチュートリアルにあるようにサーバーを起動しました。ログには、すべてが正常であることが示されています。今、私はカイエンのチュートリアルに示されているようにクライアントと接続しようとします:
ClientConnection connection = new HessianConnection(
"http://localhost:8080/hdlist_cayeene_javafx/cayenne-service");
DataChannel channel = new ClientChannel(connection);
ObjectContext context = new CayenneContext(channel);
SelectQuery select = new SelectQuery(Source.class);
List<Source> sources= context.performQuery(select);
System.out.println(sources);
それがラインになると:
List<Source> sources= context.performQuery(select);
次に、次のような例外が発生します:java.lang.NoSuchFieldException:id at java.lang.Class.getDeclaredField(Class.java:1899)at org.apache.cayenne.reflect.FieldAccessor.lookupFieldInHierarchy(FieldAccessor.java:156)at org.apache.cayenne.reflect.FieldAccessor.lookupFieldInHierarchy(FieldAccessor.java:165)at org.apache.cayenne.reflect.FieldAccessor.prepareField(FieldAccessor.java:103)at org.apache.cayenne.reflect.FieldAccessor。(FieldAccessor .java:49)org.apache.cayenne.reflect.PersistentDescriptorFactory.createAccessor(PersistentDescriptorFactory.java:355)at org.apache.cayenne.reflect.PersistentDescriptorFactory.createAttributeProperty(PersistentDescriptorFactory.java:147)
それについてのクレイジーなことは、テーブル「ソース」を空にすると、すべてが正常に機能し、例外なく空のリストが返されることです。
また、クラスセット内の10個のオブジェクトすべてに対してクエリを実行でき、例外が常に選択したクラスの最初の属性にヒットすることもわかりません。これらのクラスを調べると、フィールドがあります。それらはカイエンモデラーが生成する抽象クラス内にあり、例外が与える正確な名前を持っています。
クライアントのソースクラスは次のとおりです。
public abstract class _Source extends PersistentObject {
public static final String ID_PROPERTY = "id";
public static final String NAME_PROPERTY = "name";
protected Long id;
protected String name;
public Long getId() {
if(objectContext != null) {
objectContext.prepareForAccess(this, "id", false);
}
return id;
}
public void setId(Long id) {
if(objectContext != null) {
objectContext.prepareForAccess(this, "id", false);
}
Object oldValue = this.id;
this.id = id;
// notify objectContext about simple property change
if(objectContext != null) {
objectContext.propertyChanged(this, "id", oldValue, id);
}
}
public String getName() {
if(objectContext != null) {
objectContext.prepareForAccess(this, "name", false);
}
return name;
}
public void setName(String name) {
if(objectContext != null) {
objectContext.prepareForAccess(this, "name", false);
}
Object oldValue = this.name;
this.name = name;
// notify objectContext about simple property change
if(objectContext != null) {
objectContext.propertyChanged(this, "name", oldValue, name);
}
}
}
これは対応するサーバークラスです。
public abstract class _Source extends CayenneDataObject {
public static final String ID_PROPERTY = "id";
public static final String NAME_PROPERTY = "name";
public static final String ID_PK_COLUMN = "ID";
public void setId(Long id) {
writeProperty("id", id);
}
public Long getId() {
return (Long)readProperty("id");
}
public void setName(String name) {
writeProperty("name", name);
}
public String getName() {
return (String)readProperty("name");
}
}
カイエンのチュートリアルに示されているように、JettyWebサーバーでカイエンサーバーとクライアント3.0RC3を使用しています。
この例外が発生する理由を誰かが知っていますか?