alibaba / alibaba/fastjson2

[BUG]Spring Boot 3在GraalVM Native打包序列化异常

Open
#1,693 9 comments 0 reactions 0 assignees View on GitHub
bug
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.