agrestio / agrest

Server-side Java REST Framework for easy access to data graphs from various backends
https://agrest.io
Apache License 2.0
80 stars 34 forks source link

Exception on include when entity id is unreadable #613

Closed andrus closed 1 year ago

andrus commented 1 year ago

Assuming Cayenne entities A, B, C, related like this: A -(1..N)-> B -(N..1)-> C, and B having its ID hidden from Agrest

@AgId(readable = false, writable = false)
@Override
public ObjectId getObjectId() {
    return super.getObjectId();
}

a request to entity A with the following include (include=b.c.someProp), results in the following Exception:

i.a.c.s.CayenneRuntimeExceptionMapper: Cayenne exception
org.apache.cayenne.exp.ExpressionException: [v.4.2.RC2 Dec 01 2022 07:39:35] Can't resolve path component: [B.objectId].
at org.apache.cayenne.map.Entity$PathIterator.next(Entity.java:416)
at org.apache.cayenne.map.Entity$PathIterator.next(Entity.java:374)
at io.agrest.cayenne.path.PathOps.resolveAsDbPath(PathOps.java:98)
at io.agrest.cayenne.path.PathOps.concatWithDbPath(PathOps.java:70)
at io.agrest.cayenne.processor.CayenneQueryAssembler.queryColumns(CayenneQueryAssembler.java:115)
at io.agrest.cayenne.processor.CayenneQueryAssembler.createQueryWithParentQualifier(CayenneQueryAssembler.java:81)
at io.agrest.cayenne.processor.select.ViaQueryWithParentExpResolver.doOnParentQueryAssembled(ViaQueryWithParentExpResolver.java:46)
at io.agrest.resolver.BaseRelatedDataResolver.onParentQueryAssembled(BaseRelatedDataResolver.java:15)
at io.agrest.cayenne.processor.select.ContextualCayenneRelatedDataResolver.onParentQueryAssembled(ContextualCayenneRelatedDataResolver.java:30)
at io.agrest.resolver.BaseDataResolver.afterQueryAssembled(BaseDataResolver.java:22)
at io.agrest.resolver.BaseRelatedDataResolver.onParentQueryAssembled(BaseRelatedDataResolver.java:16)
at io.agrest.cayenne.processor.select.ContextualCayenneRelatedDataResolver.onParentQueryAssembled(ContextualCayenneRelatedDataResolver.java:30)
at io.agrest.resolver.BaseDataResolver.afterQueryAssembled(BaseDataResolver.java:22)
at io.agrest.resolver.BaseRootDataResolver.assembleQuery(BaseRootDataResolver.java:19)
at io.agrest.runtime.processor.select.stage.SelectAssembleQueryStage.doExecute(SelectAssembleQueryStage.java:22)
at io.agrest.runtime.processor.select.stage.SelectAssembleQueryStage.execute(SelectAssembleQueryStage.java:14)
at io.agrest.runtime.processor.select.stage.SelectAssembleQueryStage.execute(SelectAssembleQueryStage.java:10)
at io.agrest.processor.Processor.lambda$andThen$0(Processor.java:20)
at io.agrest.processor.Processor.lambda$andThen$0(Processor.java:18)
at io.agrest.processor.Processor.lambda$andThen$0(Processor.java:18)
at io.agrest.processor.Processor.lambda$andThen$0(Processor.java:18)
at io.agrest.processor.ExceptionMappingProcessorDecorator.execute(ExceptionMappingProcessorDecorator.java:21)
at io.agrest.runtime.DefaultSelectBuilder.get(DefaultSelectBuilder.java:147)
andrus commented 1 year ago

Fixed by #617