fastjson2 icon indicating copy to clipboard operation
fastjson2 copied to clipboard

[BUG] Graalvm版本 构建native image后出现 无法使用JSON.toJSONString

Open toohandsome opened this issue 1 year ago • 1 comments

问题描述

简要描述您碰到的问题。

使用如下代码

String pretty = JSON.toJSONString(Gcache.config, JSONWriter.Feature.PrettyFormat);
log.info("pretty:" + pretty);

得到 "pretty:{}" 实际config 对象有值,即使是空对象,如果是使用 idea debug 运行 也能得到如下字符串

{
	"phone":"",
	"password":"",
	"acNameList":"",
	"blinkerKeyList":"",
	"uid":"",
	"accessToken":"",
	"tokenPwd":"",
	"homeId":"",
	"appVersion":"",
	"deviceId":"",
	"deviceName":"",
	"osVersion":"",
	"deviceList":[
		
	],
	"useNullInfo":true
}

Config.java

@Data
public class Config {
    @JSONField(ordinal = 1)
    private String phone = "";
    @JSONField(ordinal = 2)
    private String password = "";
    @JSONField(ordinal = 3)
    private String acNameList = "";
    @JSONField(ordinal = 4)
    private String blinkerKeyList = "";
    @JSONField(ordinal = 5)
    private String uid = "";
    @JSONField(ordinal = 6)
    private String accessToken = "";
    @JSONField(ordinal = 7)
    private String tokenPwd = "";
    @JSONField(ordinal = 8)
    private String homeId = "";
    @JSONField(ordinal = 9)
    private String appVersion = "";
    @JSONField(ordinal = 10)
    private String deviceId = "";
    @JSONField(ordinal = 11)
    private String deviceName = "";
    @JSONField(ordinal = 12)
    private String osVersion = "";
    @JSONField(ordinal = 13)
    private List<Device> deviceList = new ArrayList<>();
    @JSONField(ordinal = 14)
    private boolean useNullInfo = true;
 
}

环境信息

请填写以下信息:

  • OS信息: [e.g.:win11]
  • JDK信息: [e.g.:graalvm-ce-java17-22.2.0]
  • 版本信息:[e.g.:Fastjson2 2.0.13.graal]

期待的正确结果

对您期望发生的结果进行清晰简洁的描述。

如果在 reflect-config.json 中添加

{
    "name": "com.yxd.xiaomi2meidi.entity.Config",
    "allPublicFields": true,
    "allDeclaredFields": true,
    "allDeclaredConstructors": true,
    "allPublicConstructors": true,
    "allDeclaredMethods": true,
    "allPublicMethods": true
  }

可以获取正确结果, 但是这样我觉得是不是太麻烦了,相当于每个实体类都要配置

toohandsome avatar Sep 12 '22 14:09 toohandsome

似乎也没有别的好办法吧

wenshao avatar Sep 17 '22 11:09 wenshao

环境信息

OS信息: Mac OS Monterey JDK信息: GraalVM 22.3.0-dev (build 17.0.5+8-LTS) 版本信息:Fastjson2 2.0.16.graal、SpringBoot 3.0.0 (RC1)

此问题仍然存在,不过可以使用agent模式将Bean自动写入reflect-config.json中,这样就不需要手动添加了

Bean:

//使用了Lombok

@Getter
@Setter
@Accessors(chain = true)
public class Admin {
    private String name;
    private String age;
}

自动生成的信息如下:

{
  "name":"com.example.demo.entity.Admin",
  "allDeclaredFields":true,
  "allPublicFields":true,
  "queryAllPublicMethods":true,
  "methods":[
    {"name":"getAge","parameterTypes":[] }, 
    {"name":"getName","parameterTypes":[] }
  ]
}

测试方法:

@GetMapping("/lombok")
    public Mono<String> testLombok() {
        Admin admin = new Admin()
                .setName("sjhdajksd")
                .setAge(111 + "");

        //FastJSON 2 Graalvm
        return Mono.just(JSON.toJSONString(admin));
    }

wssy001 avatar Oct 27 '22 07:10 wssy001

我先关了,这个只能这样了

wenshao avatar Mar 04 '23 19:03 wenshao