如何解决 olingo odata V2 $filter 错误?

Posted

技术标签:

【中文标题】如何解决 olingo odata V2 $filter 错误?【英文标题】:How can I solve olingo odata V2 $filter error? 【发布时间】:2021-01-15 10:57:07 【问题描述】:

我有一个 olingo OData V2 服务,它运行得几乎完美。 CRUD 方法由 POSTMAN 测试。它在Tomcat上运行,数据库是mysql,项目在Eclipse中。

这是服务的代码:

package main;

import org.apache.olingo.odata2.jpa.processor.ref.factory.JPAEntityManagerFactory;
import org.apache.olingo.odata2.processor.api.jpa.ODataJPAContext;
import org.apache.olingo.odata2.processor.api.jpa.ODataJPAServiceFactory;
import org.apache.olingo.odata2.processor.api.jpa.exception.ODataJPARuntimeException;

public class ODataServiceFromGenerator extends ODataJPAServiceFactory   
      private static final String PERSISTENCE_UNIT_NAME = "cars";

    @Override
    public ODataJPAContext initializeODataJPAContext() 

        ODataJPAContext oDataJPAContext;
        try 
            oDataJPAContext = getODataJPAContext();
            oDataJPAContext.setEntityManagerFactory(JPAEntityManagerFactory
                    .getEntityManagerFactory(PERSISTENCE_UNIT_NAME));
            oDataJPAContext.setPersistenceUnitName(PERSISTENCE_UNIT_NAME);
            return oDataJPAContext;
         catch (ODataJPARuntimeException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        

  


我可以访问此网址中的元数据: http://localhost:8080/GeneratorTry/cars.svc/$metadata

当我尝试过滤我的 EntitySet 之一时 ( http://localhost:8080/GeneratorTry/cars.svc/Vendors?$filter=startswith(Mobile,'+36') ) 我收到此错误:

HTTP 状态 500 – 内部服务器错误

类型异常报告

消息 org.apache.cxf.interceptor.Fault: org.apache.olingo.odata2.core.uri.expression.FilterParserImpl

说明服务器遇到了意外情况 这阻止了它完成请求。

异常

java.lang.RuntimeException:
org.apache.cxf.interceptor.Fault:
org.apache.olingo.odata2.core.uri.expression.FilterParserImpl
  org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:116)
  org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:331)
  org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
  org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)
  org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:223)
  org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:203)
  org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:137)
  org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:158)
  org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:243)
  org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:168)
  javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
  org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:219)
  org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

根本原因

org.apache.cxf.interceptor.Fault:
org.apache.olingo.odata2.core.uri.expression.FilterParserImpl
  org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:162)
  org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:128)
  org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:198)
  org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:261)
  org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:100)
  org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)
  org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:94)
  org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
  org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
  org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)
  org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:223)
  org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:203)
  org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:137)
  org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:158)
  org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:243)
  org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:168)
  javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
  org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:219)
  org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

根本原因

java.lang.NoClassDefFoundError:
org.apache.olingo.odata2.core.uri.expression.FilterParserImpl
  org.apache.olingo.odata2.core.uri.UriParserImpl.parseOrderByString(UriParserImpl.java:848)
  org.apache.olingo.odata2.core.uri.UriParserImpl.handleSystemQueryOptionOrderBy(UriParserImpl.java:604)
  org.apache.olingo.odata2.core.uri.UriParserImpl.handleSystemQueryOptions(UriParserImpl.java:560)
  org.apache.olingo.odata2.core.uri.UriParserImpl.parse(UriParserImpl.java:114)
  org.apache.olingo.odata2.core.ODataRequestHandler.handle(ODataRequestHandler.java:101)
  org.apache.olingo.odata2.core.rest.ODataSubLocator.handle(ODataSubLocator.java:148)
  org.apache.olingo.odata2.core.rest.ODataSubLocator.handleGet(ODataSubLocator.java:53)
  sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
  sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)
  sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)
  java.lang.reflect.Method.invoke(未知来源)
  org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:180)
  org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
  org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:198)
  org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:261)
  org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:100)
  org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)
  org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:94)
  org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
  org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
  org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)
  org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:223)
  org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:203)
  org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:137)
  org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:158)
  org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:243)
  org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:168)
  javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
  org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:219)
  org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

注意 根本原因的完整堆栈跟踪是 在服务器日志中可用。

Apache Tomcat/9.0.35

错误消息与 $orderby 相同,但它适用于 $select、$top、$skip、$count。

欢迎任何想法! 提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

看看这个来源:https://olingo.apache.org/doc/odata2/tutorials/Olingo_Tutorial_AdvancedRead_FilterVisitor.html

您可以使用 uriInfo.getFilter() 从请求中获取表达式。

【讨论】:

以上是关于如何解决 olingo odata V2 $filter 错误?的主要内容,如果未能解决你的问题,请参考以下文章

Olingo Odata v4 - 从模型生成类型、集合和元数据

如何关闭 Apache Olingo OData 2.0 缓存?

Apache Olingo OData 2.0 不支持 Java 8 LocalDatetime (java.time)

$filter 在带有 MySQL 的 JPA/Olingo 2.0.11 中不起作用

Apache Olingo 4.2 API 抛出 java.lang.IllegalArgumentException

如何在 C# 中使用 JSON 反序列化 oData V2?