[BUG]Spring Boot 3在GraalVM Native打包序列化异常
- Dominant language
- Java
- Stars
- 4.4k
- Forks
- 613
- Avg merge
- 1d 22h
- Merged PRs (30d)
- 6
Description
### 问题描述
在GraalVM CE情况下使用JSONPath获取出现一下一场
`
com.alibaba.fastjson2.JSONException: create instance error
`
### 环境信息
- OS信息: [e.g.:macOS13.4.1 (c) (22F770820d) 16 GB]
- JDK信息: [e.g.:GraalVM CE 17.0.7]
- 版本信息:[e.g.:Fastjson2 2.0.37]
### 重现步骤
1. 调用方法
```
JSON.parseArray(data).toList(PD01.class);
```
2. 输入参数
```
// 无
```
3. 出现 `com.alibaba.fastjson2.JSONException: create instance error` 错误
4. 复现代码
```java
public class X {
public static void nativeTest() {
String data = "[{\"PD01A\":{\"PD01AD03\":2,\"PD01AD01\":1}}}]";
List l = JSON.parseArray(data).toList(PD01.class);
}
public static void main(String[] args) {
nativeTest();
}
public static class PD01 {
private PD01A PD01A;
public PD01() {}
public PD01(PD01A PD01A) { this.PD01A = PD01A; }
public PD01A getPD01A() { return PD01A; }
public void setPD01A(PD01A PD01A) { this.PD01A = PD01A; }
}
public static class PD01A {
private String PD01AD01;
private String PD01AD03;
public PD01A() {}
public PD01A(String PD01AD01, String PD01AD03) {
this.PD01AD01 = PD01AD01;
this.PD01AD03 = PD01AD03;
}
public String getPD01AD01() { return PD01AD01; }
public void setPD01AD01(String PD01AD01) { this.PD01AD01 = PD01AD01; }
public String getPD01AD03() { return PD01AD03; }
public void setPD01AD03(String PD01AD03) { this.PD01AD03 = PD01AD03; }
}
}
```
### 期待的正确结果
能正确获得List对象,并操作
### 相关日志输出
```log
2023-07-27T15:57:34.115+08:00 ERROR 97705 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: com.alibaba.fastjson2.JSONException: create instance error, class com.example.test_a.ttt.PD01] with root cause
com.alibaba.fastjson2.JSONException: create instance error, class com.example.test_a.ttt.PD01
at com.alibaba.fastjson2.reader.ObjectReaderAdapter.createInstance0(ObjectReaderAdapter.java:333) ~[test_a:na]
at com.alibaba.fastjson2.reader.ObjectReaderAdapter.createInstance(ObjectReaderAdapter.java:382) ~[test_a:na]
at com.alibaba.fastjson2.reader.ObjectReaderBean.readObject(ObjectReaderBean.java:332) ~[test_a:na]
at com.alibaba.fastjson2.reader.ObjectReaderImplList.readObject(ObjectReaderImplList.java:570) ~[na:na]
at com.alibaba.fastjson2.JSONReader.readArray(JSONReader.java:2151) ~[test_a:na]
at com.alibaba.fastjson2.JSON.parseArray(JSON.java:2469) ~[na:na]
at com.example.test_a.TestAApplication.index(TestAApplication.java:58) ~[test_a:na]
at java.base@17.0.7/java.lang.reflect.Method.invoke(Method.java:568) ~[test_a:na]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:207) ~[test_a:6.0.10]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:152) ~[test_a:6.0.10]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[test_a:6.0.10]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884) ~[test_a:6.0.10]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) ~[test_a:6.0.10]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[test_a:6.0.10]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081) ~[test_a:6.0.10]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974) ~[test_a:6.0.10]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011) ~[test_a:6.0.10]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[test_a:6.0.10]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[test_a:6.0]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[test_a:6.0.10]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[test_a:6.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) ~[na:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[na:na]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[test_a:10.1.10]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[na:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[na:na]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[test_a:6.0.10]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[test_a:6.0.10]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[na:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[na:na]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[test_a:6.0.10]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[test_a:6.0.10]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[na:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[na:na]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[test_a:6.0.10]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[test_a:6.0.10]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[na:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[na:na]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:166) ~[na:na]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[na:na]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) ~[test_a:10.1.10]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[na:na]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[test_a:10.1.10]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[na:na]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341) ~[na:na]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) ~[na:na]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[test_a:10.1.10]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:894) ~[na:na]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[na:na]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[test_a:10.1.10]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[na:na]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[na:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[na:na]
at java.base@17.0.7/java.lang.Thread.run(Thread.java:833) ~[test_a:na]
at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:807) ~[test_a:na]
at org.graalvm.nativeimage.builder/com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:210) ~[na:na]
```
#### 附加信息
1. 项目POM
```
4.0.0
org.springframework.boot
spring-boot-starter-parent
3.1.1
com.example
test_a
0.0.1-SNAPSHOT
test_a
test_a
17
commons-io
commons-io
2.12.0
com.alibaba.fastjson2
fastjson2
2.0.37
org.springframework.boot
spring-boot-starter-web
org.json
json
20230618
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.graalvm.buildtools
native-maven-plugin
org.springframework.boot
spring-boot-maven-plugin
org.projectlombok
lombok
```
2. 项目以Spring Native方式打包
```
# mvn clean native:compile -Pnative -DskipTests=true -T 10
# target/test_a
```
Contributor guide
Research direction
Start by reproducing the native build with `mvn clean native:compile -Pnative -DskipTests=true -T 10` and the `JSON.parseArray(data).toList(PD01.class)` entry point. Trace the reported failure in `ObjectReaderAdapter.java`, then verify that the sample native executable returns a `List` and supports its fields without the `create instance error`.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java, spring-boot
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100