【问题标题】:Error "Failed to construct URI for OData request with request path" SAP Java VDM withQueryParameter错误“无法使用请求路径构造 OData 请求的 URI”SAP Java VDM withQueryParameter
【发布时间】:2020-11-03 14:59:15
【问题描述】:

我已经使用 SAP SDK 3.29.1 在 Java 中创建了一个 CAP VDM。 在事件处理程序@On read 中,我想将输入过滤器传递给 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"));

谢谢。

【问题讨论】:

  • 请更好地格式化您的问题。很难阅读。考虑将代码示例包装在反引号中。
  • 嗨 Stani,我认为堆栈跟踪将有助于进一步调查。我也同意@Emdee 的观点,即更好的格式和更少的缩写将有助于更快地了解问题的本质。
  • 是的,请添加堆栈跟踪。
  • 谢谢,我改了格式,希望更清楚。
  • @StaniSorre 请按要求添加堆栈跟踪。它可以帮助我们确定异常的根本原因。

标签: sap-cloud-sdk


【解决方案1】:

在日志中运行查询时,我收到错误消息:“无法使用请求路径为 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);

请告诉我,因为这可能是一个需要解决的问题。

【讨论】:

    【解决方案2】:

    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 在他的回答中指出的那样对其应用编码。

    【讨论】:

    • 这是一个例子。我可以有很多过滤器组合或或和,我如何拆分它们。
    • 难道没有像旧版SDK那样将所有过滤器一起传递的另一种选择吗?
    • 也因为我不知道他们通过什么过滤器让我通过
    • 好的,这是有道理的,在这种情况下,亚历克斯的回答可能是今天要走的路。我仍然会在这里留下我的答案供其他人查看,因为他们可能有不同的要求。
    猜你喜欢
    • 2021-02-23
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    相关资源
    最近更新 更多