0

リモートクライアントから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を使用しています。

この例外が発生する理由を誰かが知っていますか?

4

2 に答える 2

0

クライアントクエリで使用される「ソース」クラスが実際にはクライアントではなくサーバーバージョンである可能性はありますか?

于 2012-06-11T08:15:57.430 に答える
0

反対票

だから私はそれを自分で見つけました:このエラーの最も一般的な理由は、カイエンのチュートリアル内でここに述べられているように、サーバーにクライアントエンティティを提供するのを忘れたことです:

https://cwiki.apache.org/CAYDOC12/remote-object-persistence-tutorial-webservice.html

"As of version 1.2, both client and server persistent classes need to be present on the server (client of course only needs client classes). This is a minor inconvenience that will be addressed in the future releases."

したがって、単に共有プロジェクトを作成し、クライアントプロジェクトとサーバープロジェクト内でMavenの依存関係を作成します

幸運を

于 2012-09-13T07:59:09.207 に答える