首页 > 解决方案 > 如何使用 eclipselink jpa 在 POST Rest API 上使用原始类型

问题描述

我正在尝试使用 Java 和 JPA (EclipseLink) 创建一个 REST API

问题是:

我有一个 ENDPOINT sell(long var1, long var2),它的 URI 是http://localhost:8080/myproject/api/sell

当我尝试调用此端点发送波纹管有效负载时,出现错误:

{ "var1":"1", "var2":"2" }

17-Aug-2019 12:29:51.535 WARNING [http-nio-8080-exec-3] org.apache.cxf.phase.PhaseInterceptorChain.doDefaultLogging Interceptor for {http://resources.myproject.myname.com/}ProductResource has thrown exception, unwinding now
 org.apache.johnzon.mapper.MapperException: long not instantiable
        at org.apache.johnzon.mapper.MappingParserImpl.buildObject(MappingParserImpl.java:299)
        at org.apache.johnzon.mapper.MappingParserImpl.readObject(MappingParserImpl.java:150)
        at org.apache.johnzon.mapper.MappingParserImpl.readObject(MappingParserImpl.java:142)
        at org.apache.johnzon.mapper.MappingParserImpl.readObject(MappingParserImpl.java:129)
        at org.apache.johnzon.mapper.Mapper.mapObject(Mapper.java:310)
        at org.apache.johnzon.mapper.Mapper.readObject(Mapper.java:228)
        at org.apache.johnzon.jaxrs.JohnzonMessageBodyReader.readFrom(JohnzonMessageBodyReader.java:78)
        at org.apache.johnzon.jaxrs.DelegateProvider.readFrom(DelegateProvider.java:51)
        at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1379)
        at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1330)
        at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:856)
        at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:815)
        at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:215)
        at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:78)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
        at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
        at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:267)
        at org.apache.openejb.server.cxf.rs.CxfRsHttpListener.doInvoke(CxfRsHttpListener.java:253)
        at org.apache.tomee.webservices.CXFJAXRSFilter.doFilter(CXFJAXRSFilter.java:94)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.openejb.server.httpd.EEFilter.doFilter(EEFilter.java:65)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
        at org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)

这个问题只发生在非实体类型,如 Long、long、Integer、int、String 等。

如果我使用sell(MyLongEntity var1, MyLongEntity var2)它工作正常。

我正在使用 Maven 和 H2 数据库(文件)在 Java 8、EclipseLink 上运行它

那么,你们对这个例外有什么想法吗?

org.apache.cxf.interceptor.Fault: long not instantiable

更新:我已更改我的 POST 参数以使用我的实体。所以,现在我打电话sell(MyEntity myEntity),它工作正常。但是我仍然不知道为什么我不能使用原始类型。正如评论所指出的,它与 json 序列化/反序列化有关。

标签: javaapijpaexceptioneclipselink

解决方案


推荐阅读