错误“无法为带请求路径的OData请求构造URI” SAP Java VDM withQueryParameter

问题描述

我已经使用SAP SDK 3.29.1在Java中创建了CAP VDM。 在事件处理程序@On读取中,我想将输入过滤器传递给VDM。

ES。

@On(event = CdsService.EVENT_READ,entity = "XXXX")
public void readXXX(CdsReadEventContext context) throws ODataException {

final String filter = context.getParameterInfo().getQueryParameter("$filter");
final List<XXXXX> dati = new DefaultXXXService().getAllXXXX().select().withQueryParameter("$filter",filter).executeRequest(dest);

}

在日志中运行查询时,出现错误: “无法为具有请求路径的OData请求构造URI ...” “查询索引为95的非法字符。。。”

但是电话的路径和过滤器是正确的,您能帮我吗?

在我使用的旧版sdk中:

FilterExpression filtriFrontEnd =FilterExpressionConverter.convertTo(queryRequest.getQueryExpression());

final List<XXXX> area = new DefaultXXXXService().getAllXXX().filter(new UncheckedFilterExpression<>(filtriFrontEnd)).select().execute(new ErpConfigContext("XXX"));

谢谢。

解决方法

在日志中运行查询时,出现错误:“无法为带请求路径的OData请求构造URI ...”“查询索引95处的非法字符。。。”

您可以检查以下内容是否对您有用。.

import com.sap.cloud.sdk.datamodel.odata.client.request.ODataUriFactory;

final String filter = context.getParameterInfo().getQueryParameter("$filter");
final String encodedFilter = ODataUriFactory.encodeQuery(filter);
final List<XXXXX> dati = new DefaultXXXService().getAllXXXX().select().withQueryParameter("$filter",encodedFilter ).executeRequest(dest);

请让我知道,因为这可能是一个需要解决的问题。

,

withQueryParameter的方法协定明确警告了此API的使用:

Using this function to bypass fluent helper method calls can lead to unsupported response handling. There is no contract on the order or priority of parameters added to the query.

请直接使用filter函数。邮政编码应该有一个实体字段,该代码应类似于以下内容:

new DefaultXXXService()
    .getAllXXXX()
    .filter(Entity.POSTAL_CODE.eq("16100"))

如果这在您的用例中不可行,我建议像您以前一样手动构建此过滤器表达式,并像Alex在其答案中指出的那样对其应用编码。