使用反向工程对象时,Apache Cayenne中的NoSuchFieldException

时间:2012-06-07 21:25:57

标签: apache-cayenne

从远程客户端查询select到apache cayenne服务器时出现以下问题。

出于测试目的,我只从一个表生成一个独立的类。我生成了cleint类(超类和子类)和Server类。我启动了像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)     在org.apache.cayenne.reflect.FieldAccessor.lookupFieldInHierarchy(FieldAccessor.java:165)     在org.apache.cayenne.reflect.FieldAccessor.prepareField(FieldAccessor.java:103)     在org.apache.cayenne.reflect.FieldAccessor。(FieldAccessor.java:49)     at org.apache.cayenne.reflect.PersistentDescriptorFactory.createAccessor(PersistentDescriptorFactory.java:355)     at org.apache.cayenne.reflect.PersistentDescriptorFactory.createAttributeProperty(PersistentDescriptorFactory.java:147)

关于它的疯狂之处是当我清空表“Source”时,一切正常,我得到一个空列表,没有任何例外。

另外我不清楚我可以查询我的类集中的所有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");
}

}

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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."

因此,只需创建share-project并在客户端和服务器项目中执行maven依赖

祝你好运