繁体   English   中英

如何在 MockMvc 中使用 Gson 而不是 Jackson?

[英]How to use Gson instead of Jackson for MockMvc?

我花了一天的时间试图找到解决方案,但找不到任何解决此问题的在线资源。

我正在为我的应用程序使用 Gson 进行消息转换,它在单元测试之外工作正常。 我什至添加了一个HttpMessageConverters bean 来优先于 Jackson 而不是将配置值写入application.yml 这仅在运行应用程序时有效。

现在我的问题是,我如何使用MockMvc的 Gson 序列化/反序列化? 我有一个带有@SerializedName("field_one")注释的类,其值与实际名称不同。 我最接近找到答案的是下面一个没有帮助的答案:

https://stackoverflow.com/a/20510028/3948882

任何想法如何替换ObjectMapper或让MockMvc使用 Gson 而不是 Jackson?


编辑:要添加更多上下文:

当我尝试发送一个用 Gson 转换为 Json 的Model ,它立即被拒绝(400),因为我对模型中的每个字段都有@NotNull注释。 当它在控制器中反序列化时,它将字段设置为空。 下面的例子有@Valid ,它确保Model检出。

@RequestMapping(value = "accept", method = RequestMethod.POST)
public Model resp(@Valid @RequestBody Model model){
    return model;
}

另一方面,当我在没有@Valid情况下到达端点时,传递了一个让杰克逊@Valid的 json,并且我得到了一个模型,我无法检查任何字段:

mockMvc.perform(
    post("/test/accept")
        .contentType(MediaType.APPLICATION_JSON)
        .content(json))
    .andExpect(jsonPath("$.field_one", is("Hello world!")))

例外:

java.lang.AssertionError: No value at JSON path "$.field_one", exception: No results for path: $['field_one']

您必须正确设置MockMvc

MockMvc mvc = MockMvcBuilders.standaloneSetup(new YourController())
                             .setControllerAdvice(new SomeExceptionHandler())
                             .setMessageConverters(new GsonHttpMessageConverter()) //<-- THIS
                             .build();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM