首页 >> 大全

Kotlin使用fastjson报错:create instance error

2023-11-12 大全 30 作者:考证青年

今天遇到一个问题,导出文件中显示不是数据,而是服务器内部的报错信息。

报错日志如下

com.alibaba.fastjson.JSONException: create instance error, public com.xxx.xxx.AzResourceFilter(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)at com.alibaba.fastjson.util.TypeUtils.castToJavaBean(TypeUtils.java:1378)at com.alibaba.fastjson.util.TypeUtils.cast(TypeUtils.java:932)at com.alibaba.fastjson.JSON.toJavaObject(JSON.java:1108)at com.xxx.xxx.service.impls.ExporterServiceImpl.transBody(ExporterServiceImpl.kt:117)at com.xxx.xxx.service.impls.ExporterServiceImpl.export(ExporterServiceImpl.kt:69)at com.xxx.xxx.controller.ExporterController.export(ExporterController.kt:63)at com.xxx.xxx.controller.ExporterController$$FastClassBySpringCGLIB$$252a306f.invoke(<generated>)at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:100)at com.xxx.xxx.aop.requestAspect.doAroundService(requestAspect.java:108)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:567)at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)at com.xxx.xxx.controller.ExporterController$$EnhancerBySpringCGLIB$$ea7b04b4.export(<generated>)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:567)at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800)at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)at javax.servlet.http.HttpServlet.service(HttpServlet.java:665)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:90)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.cloud.sleuth.instrument.web.ExceptionLoggingFilter.doFilter(ExceptionLoggingFilter.java:50)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at brave.servlet.TracingFilter.doFilter(TracingFilter.java:86)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:117)at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:106)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)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:202)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1639)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.base/java.lang.Thread.run(Thread.java:830)
Caused by: com.alibaba.fastjson.JSONException: create instance error, public com.xxx.xxx.entities.inputs.AzResourceFilter(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.createInstance(JavaBeanDeserializer.java:1511)at com.alibaba.fastjson.util.TypeUtils.castToJavaBean(TypeUtils.java:1376)... 80 more
Caused by: java.lang.IllegalArgumentException: wrong number of argumentsat java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.createInstance(JavaBeanDeserializer.java:1508)... 81 more

报错代码段

    private fun <T> transBody(body: Any?, clazz: Class<T>): T? {val filter =  when (body) {null -> nullelse -> JSON.toJavaObject(JSON.parseObject(JSON.toJSONString(body)),clazz)}return filter;}

@KtNoArgsConstructor
data class AzResourceFilter (@ApiModelProperty("所属大区ID,空表示查询全国的")val regionId: String?,@ApiModelProperty("所属数据中心")val dcId: String?,@ApiModelProperty("所属VIM")val vimId: String?,@ApiModelProperty("厂家")val vendorId: String?,@ApiModelProperty("名称(模糊搜索)")val nameLike: String?,@ApiModelProperty("表格下钻名称")val xtName: String?,@ApiModelProperty("所属Region")val respoolRegionId: String?,@ApiModelProperty("权限大区ID")val pLocationId: String?,@ApiModelProperty("权限资源池ID")val pVimId: String?
): BasicFilter()

由于对完全不熟悉,所以一点点摸索着解决。

首先看到最后一个信息, by: java.lang.tion: wrong of 。

想到可能是反向代理中,没有对应的构造方法,于是找class文件夹下,看看编译过后是不是没有这个9个参数的构造方法。

结果发现拥有构造方法,那么换个思路。

差倒数第二个信息, by: com...: error。

找到这条博客:

以及这条博客:

上面说是由于内嵌类没有使用修饰造成的。但是问题中的类是一个继承了父类的子类,似乎跟内嵌类是不一样的问题。

于是开始陷入迷茫。

迷茫中,将继承父类的字段加到子类中,把父类引用删除,变成一个集成了父类字段和子类字段的新类,使用它去做导出,结果喜人,文件能正常显示,而且也不报错了。

那么问题一定就出在继承的这个父类上。

父类代码如下:

open class BasicFilter(// 大区资源权限var ppSpaceId: List<String>?,// 资源池资源权限var ppVimId: List<String>?,// 省份资源权限var ppProvinceId: List<String>?,// 专业资源权限var ppNeGroupId: List<String>?,// 网元类型资源权限var ppNeTypeId: List<String>?,//是否管理员var ppAdmin: Boolean) {constructor() : this(null,null,null,null,null, false)
}

由于线索都断了,于是只能进源码看到底是哪一行报错了

错误使用solve_错误使用fzero_

此时内存中的状态是这样的:

可以看到中除了子类自己的属性,还有父类中的属性,其中父类中的属性都是默认字段,6个list为空,一个是false。

在这里似乎感觉问题清晰了,子类构造器中只有自己的属性,而传入的参数,包含了子类以及父类的属性,所以最终抛出的异常是

error, com.xxx.xxx.(java.lang.,java.lang.,java.lang.,java.lang.,java.lang.,java.lang.,java.lang.,java.lang.,java.lang.)

要么给子类添加一个包含了父类的构造方法,要么把父类中的属性加到子类中。

本来想通过子类直接调用父类的构造方法来解决,但是一直没有找到合适的语法。

最后只能用最蠢的方法了……

override var ppSpaceId: List<String>?,
// 资源池资源权限
override var ppVimId: List<String>?,
// 省份资源权限
override var ppProvinceId: List<String>?,
// 专业资源权限
override var ppNeGroupId: List<String>?,
// 网元类型资源权限
override var ppNeTypeId: List<String>?,//是否管理员
override var ppAdmin: Boolean

将父类字段全部在子类中重写,让子类生成自己的构造方法。

唉,不知道以后还能不能有时间继续研究。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了