CDS OData Java服务com.sap.cds.NonUniqueResultException

2020-08-19 10:01发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)你好, 我是这个论坛的新手,也...

         点击此处--->   EasySAP.com群内免费提供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 并实现了生成的" Case"接口。 CaseImpl提供了所有四个属性,如下所示:

 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。

预先感谢,

问候

杰伊德