从远程客户端查询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所示 教程。
有人知道为什么会发生这种异常吗?
答案 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依赖
祝你好运