0

从远程客户端查询选择到 apache cayenne 服务器时,我遇到以下问题。

出于测试目的,我只从一张表中生成了一个独立的类。我生成了客户端类(超类和子类)和服务器类。我启动了服务器,如 cayenne 教程中所示。日志告诉我一切都很好。现在我尝试与客户端连接,如 cayenne 教程中所示:

    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) 在 org.apache.cayenne.reflect.PersistentDescriptorFactory.createAttributeProperty(PersistentDescriptorFactory.java:147)

关于它的疯狂之处在于,当我清空“源”表时,一切正常,我毫无例外地得到一个空列表。

我也不清楚我可以查询我的类集中的所有 10 个对象,并且异常总是命中所选类的第一个属性。如果我研究这些课程,那么该领域就在那里。它们位于 cayenne 建模器生成的抽象类中,并且具有异常给出的确切名称。

这是客户端上的源类:

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");
}

}

我在 Jetty WebServer 上使用 Cayenne Server 和 Client 3.0RC3,如 cayenne 教程中所示。

有谁知道为什么会发生这种异常?

4

2 回答 2

0

客户端查询中使用的“Source”类是否真的是服务器版本,而不是客户端?

于 2012-06-11T08:15:57.430 回答
0

否决票

所以我自己发现了:此错误的最常见原因是您忘记向服务器提供客户端实体,如 cayenne 教程中所述:

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 回答