如何使用Gson代替Jackson来获取MockMvc?

时间:2017-10-13 16:25:55

标签: java jackson gson mockmvc

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

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

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

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

如何替换ObjectMapperMockMvc使用Gson代替杰克逊?

编辑:添加更多上下文:

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

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

另一方面,当我去一个没有@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']

1 个答案:

答案 0 :(得分:2)

您必须正确设置MockMvc

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