@RequestBody 在发出 POST 请求时给出空 JsonObject

2023-12-25

我有以下方法:

@RequestMapping(value = "/app/write", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
public
@ResponseBody
Status writeBuildData(@RequestBody JsonObject templateDataJSON){}

基本上我做了一个AjaxPOST请求发送 JSON,我总是得到一个空的JsonObject {}因此

JsonObject templateDataJSON = "{}";

但是如果我使用 String 而不是JsonObject,我得到了正确的值。

这个应用程序是用春季Mvc 4.1.4.

依赖项:

compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.13'
compile 'com.google.code.gson:gson:2.3.1'

知道我缺少什么以及为什么JsonObject不会被注射并且总是给我{}?


Spring 不再支持 Jackson 1 作为消息转换器实现。

So your

compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.13'

其实对于Spring来说是没有意义的。

Your

compile 'com.google.code.gson:gson:2.3.1'

会导致Spring使用GsonHttpMessageConverter基本上,做

String json = "{\"random\":\"42\"}";
Gson gson = new Gson();
JsonObject jsonObject = gson.fromJson(json, JsonObject.class);

JsonObject是Gson类型。 Gson 意识到了这一点,并且知道如何将 JSON 对象 json 反序列化到其中。这将正常工作并将生成JsonObject其值为

{"random":"42"}

既然你说你得到的是空的JsonObject,我只能假设你的类路径上有 Jackson 2。

Spring 注册 JacksonHttpMessageConverter, MappingJackson2HttpMessageConverter, 之前GsonHttpMessageConverter如果两者都存在于类路径中。

对于 Jackson,Spring 基本上会反序列化您的请求主体

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
JsonObject jsonObject = mapper.readValue(json, JsonObject.class);

你会注意到结果

{}

这是因为杰克逊对该类型一无所知JsonObject所以它必须动态构建反序列化策略。该策略取决于 Jackson 定义为 setter 的属性(用于反序列化的上下文)或任何带有注释的属性@JsonProperty,这显然JsonObject没有。所以它基本上认为类型JsonObject没有任何属性(或者可能没有出现在自定义 JSON 内容中)。因此,因为它忽略任何未知属性(这会导致它抛出异常),所以它只是返回一个新的空的JsonObject object.

一种解决方案是从类路径中删除 Jackson 2。另一种解决方案是显式添加HttpMessageConverter实例按您想要的顺序排列。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@RequestBody 在发出 POST 请求时给出空 JsonObject 的相关文章

随机推荐