点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
你好,
我是这个论坛的新手,也是SAP Cloud Foundry/CAP的新手。 我在任何地方都找不到以下问题的解决方案。
我已经使用CAP Java Maven原型创建了Odata Java服务,如下所述:https://cap.cloud.sap/docs/java/getting-started
除了将实体和服务分为两个文件以外,最终我将它们组合成一个cds文件:
服务服务{ 实体案例{ 密钥ID:整数; caseNumber:整数; 描述:字符串; phase:字符串; } }
接下来,我创建了一个CaseImpl,它扩展了HashMap
public Integer getId(){ return(Integer)get(ID); } public void setId(final Integer id){ put(ID,id); }
因此,基本上,CaseImpl是一个HashMap,其中包含所有必要的String键/Object值组合。
然后,我添加了一个自定义事件处理程序,如此处所述: https://developers.sap.com/tutorials/cp-cap-java-custom-handler.html
它包含此方法:
@On(事件= CdsService.EVENT_READ,实体=" service.Case") 公共无效onReadCases(最终CdsReadEventContext上下文){ context.setResult(caseDao.getCases()); }
... getCases()方法返回四个ID为1、2、3和4标识的CaseImpl实例的集合。
调用/odata/v4/service/Case
时,整个集合可以完美显示。但是,在调用/odata/v4/service/Case(1)时,我希望仅看到ID = 1的Case,但得到:
com.sap.cds.NonUniqueResultException:结果包含多个行 在com.sap.cds.impl.ResultImpl.single(ResultImpl.java:90)〜[cds4j-core-1.8.0.jar:na] 在com.sap.cds.adapter.odata.v4.processors.impl.ResultSetProcessor.toEntity(ResultSetProcessor.java:113)〜[cds-adapter-odata-v4-1.4.0.jar:na] 在com.sap.cds.adapter.odata.v4.processors.impl.DataProvider.lambda $ processReadRequest $ 6(DataProvider.java:291)〜[cds-adapter-odata-v4-1.4.0.jar:na] 在com.sap.cds.services.impl.runtime.CdsRuntimeImpl.runInRequestContext(CdsRuntimeImpl.java:158)〜[cds-services-impl-1.4.0.jar:na] 在com.sap.cds.adapter.odata.v4.processors.impl.DataProvider.processReadRequest(DataProvider.java:276)〜[cds-adapter-odata-v4-1.4.0.jar:na] 在com.sap.cds.adapter.odata.v4.processors.impl.DataProvider.processRequestsBasedOnMethods(DataProvider.java:110)〜[cds-adapter-odata-v4-1.4.0.jar:na] 在com.sap.cds.adapter.odata.v4.processors.impl.DataProvider.lambda $ processChangesetRequest $ 0(DataProvider.java:88)〜[cds-adapter-odata-v4-1.4.0.jar:na] 在com.sap.cds.adapter.odata.v4.handlers.ODataProcessorHandler.lambda $ runInReqContextIfNecessary $ 2(ODataProcessorHandler.java:812)〜[cds-adapter-odata-v4-1.4.0.jar:na] 在com.sap.cds.services.impl.runtime.CdsRuntimeImpl.runInChangeSetContext(CdsRuntimeImpl.java:167)〜[cds-services-impl-1.4.0.jar:na] 在com.sap.cds.adapter.odata.v4.handlers.ODataProcessorHandler.runInReqContextIfNecessary(ODataProcessorHandler.java:811)〜[cds-adapter-odata-v4-1.4.0.jar:na] 在com.sap.cds.adapter.odata.v4.processors.impl.DataProvider.processChangesetRequest(DataProvider.java:94)〜[cds-adapter-odata-v4-1.4.0.jar:na] 在com.sap.cds.adapter.odata.v4.processors.impl.GenericODataProcessor.readEntityInternal(GenericODataProcessor.java:410)〜[cds-adapter-odata-v4-1.4.0.jar:na] 在com.sap.cds.adapter.odata.v4.processors.impl.GenericODataProcessor.readEntity(GenericODataProcessor.java:398)〜[cds-adapter-odata-v4-1.4.0.jar:na] 在com.sap.cds.adapter.odata.v4.processors.impl.GenericODataProcessor.readEntity(GenericODataProcessor.java:130)〜[cds-adapter-odata-v4-1.4.0.jar:na]
(等,没有原因)
此外,在调用/odata/v4/service/Case?$ top = 2时,将显示所有四种情况。 好像过滤器被忽略了。
我做错了什么? CDS版本是1.4.0。
预先感谢,
问候
杰伊德
好吧,男孩遇到了世界,我知道我们现在做错了。
在实现@On句柄时,显然CDS希望您提供所需的内容。 我以为我们可以提供整个实体集合(案例),而CDS可以为我们做任何适合的事情。
只要CDS可以从数据库中检索数据,它就可以做到这一点。
问题是,我们需要能够向客户端提供最新的案例,然后从后端检索这些案例。 不是那些缓存在数据库中的。
我们通过删除@On句柄并创建一个@Before句柄来解决我们的问题,在该句柄中,我们从数据库中删除了所有Cases,并插入了最新版本。 然后CDS会处理这些案件,并为我们做任何必要的过滤。
格雷戈·沃尔夫& Maximilian Streifeneder 你们也许会认出这样的东西吗?
一周热门 更多>