java - 如何使用 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 序列化/反序列化有关。
解决方案
推荐阅读
- c++ - 将局部变量移动到不同类型的返回值
- c# - 如何访问列表中的元素
当 T 只存储在类型变量中? - sql - SqlTableDependency 会在一段时间后停止监听更改
- excel - 单击提交按钮后,有没有办法阻止某些 Excel 单元格输入?
- marklogic - MarkLogic 中有没有一种方法可以通过 REST API 查询视图,而无需在中间层为其编写代码?
- go - 就地截断切片
- excel - 是否有 VBA 函数将文件名拉入代码中?
- java - 如何将数字插入已排序的链表
- python - 在 py.test 中是否可以报告测试运行中生成的任意值?
- r - 如何通过R中dplyr中的另一个变量(而不是频率)计算比例