首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强迫SpingBoot对杰克逊使用Gson

强迫SpingBoot对杰克逊使用Gson
EN

Stack Overflow用户
提问于 2020-09-24 16:19:59
回答 2查看 1.5K关注 0票数 3

我试图强迫SpringBoot使用Gson而不是杰克逊。我已经阅读了我在网上找到的大部分文章,我仍然看到杰克逊被使用。以下是我所做的

  1. 已添加
代码语言:javascript
复制
spring:
  http: { converters: { preferred-json-mapper: gson } }
  mvc: { converters: {preferred-json-mapper: gson } }

在application.yaml中

  1. 更新POM
    • 添加gson依赖项
    • jackson-databind添加到排除列表中,使spring-boot-starter-web不再学究。

  2. @EnableAutoConfiguration(exclude = JacksonAutoConfiguration.class)添加到主类中。
  3. 写在@Configuration类下面:
代码语言:javascript
复制
@Configuration
@Slf4j
public class MyConfig implements WebMvcConfigurer {
  
  @Override
  public void extendMessageConverters (List<HttpMessageConverters<?>> converters) {
    log.debug("Setting gson converter");
    converters.add(new GsonHttpMessageConverter(myCustomGsonInstance()));
  }

  public Gson myCustomGsonInstance() {
    return new Gson();
  }
}

在调试中运行测试时,我可以看到杰克逊仍然列在HttpMessageConverters列表中,而Gson没有。

更新:在运行时和下面的测试类中都可以看到这种行为。

代码语言:javascript
复制
@AutoConfigureMockMvc
@SpringBootTest(webEnvironment = MOCK)
@ExtendWith(MockitoExtension.class)
public class MyTestClass {

  @Autowired
  private MyController controller;
  
  private MockMvc mockMvc;

  @BeforeEach
  public void setUp(){
    mockMvc = MockMvcBuilders.standaloneSetup(controller)
    // .setMessageConverters(new GsonHttpMessageConverter(myCustomGsonInstance())) // if I add this, the test passes.
    .build();
  }
  
  @Test
  public void happyFlow(){
    // given
    URI uri = "/test/uri";
    HttpHeaders headers = new HttpHeaders();
    headers.set(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);
    
    // when
    String responseBody = mockMvc.perform(get(uri).headers(headers)).andReturn().getResponse().getContentAsString();

    // then
    assertThat(responseBody, wasSerializedByGson());
  }
}
EN

回答 2

Stack Overflow用户

发布于 2020-09-24 16:34:36

看起来您在配置首选的JSON映射程序时使用了错误的属性。您正在使用spring.http.converters.preferred-json-mapper,但正确的属性是spring.mvc.converters.preferred-json-mapper。在application.yaml中,这将是以下内容:

代码语言:javascript
复制
spring:
  mvc:
    converters:
      preferred-json-mapper: gson
票数 3
EN

Stack Overflow用户

发布于 2020-09-24 20:36:06

Spring附带Gson自动配置支持:源代码

因此,除了启用yaml属性之外,您还必须使用Gson单例实例以供WebMvcConfigurer使用:

代码语言:javascript
复制
@Configuration
@Slf4j
public class MyConfig implements WebMvcConfigurer {

  @Autowired
  private Gson gson;
  
  @Override
  public void extendMessageConverters (List<HttpMessageConverters<?>> converters) {
    log.debug("Setting gson converter");
    converters.add(new GsonHttpMessageConverter(gson));
  }

}

和从安迪·威尔金森借来的yaml属性

代码语言:javascript
复制
spring:
  mvc:
    converters:
      preferred-json-mapper: gson

使用此设置,Spring使用的Gson实例与配置中的相同。

在你的测试中,应该是这样的:

代码语言:javascript
复制
@WebMvcTest(MyController.class)
public class MyTestClass {

  @Autowired
  private MockMvc mockMvc;
  @Autowired
  private MyController controller;

  @Test
  public void happyFlow(){
    // given
    URI uri = "/test/uri";
    HttpHeaders headers = new HttpHeaders();
    headers.set(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);
    
    // when
    String responseBody = mockMvc.perform(get(uri).headers(headers)).andReturn().getResponse().getContentAsString();

    // then
    assertThat(responseBody, wasSerializedByGson());
  }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64050458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档