【问题标题】:Custom Jackson2ObjectMapperBuilder not recognized in an integration springboot test在集成 springboot 测试中无法识别自定义 Jackson2ObjectMapperBuilder
【发布时间】:2017-04-21 04:53:52
【问题描述】:

全部

我在我的主 Spring Boot 应用程序类中自定义了Jackson2ObjectMapperBuilder,如下所示。

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}

@Autowired
public void configureJackson(Jackson2ObjectMapperBuilder builder) {
    builder.filters( new SimpleFilterProvider().addFilter( "customFilter", new ExampleFilter() ) );
}

其中ExampleFilter 是SimpleBeanPropertyFilter 的扩展。 我的 POJO 用 Ja​​ckson 的 @JsonFilter("customFilter") 注释。
我已经使用 @RestController 和 @GetMapping 注释通过 HTTP 公开了 POJO。 这可以正常工作,并且当我运行应用程序并访问端点时会调用自定义过滤器。

现在我有一个如下编写的集成测试。

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class IntegrationTest {

    @LocalServerPort
    private int port;

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void getUser() throws Exception {
        POJO obj = this.restTemplate.getForObject("http://localhost:" + this.port + "/pojo", POJO.class);

        Assertions.assertThat(obj).isNotNull();
        Assertions.assertThat(obj.getFirstName()).isEqualTo("Jane");
        Assertions.assertThat(obj.getLastName()).isEqualTo("Doe");
        Assertions.assertThat(obj.getAge()).isEqualTo("24");
    }
}

当我运行测试时,obj 为 null,我看到一个错误 no FilterProvider configured

Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: Can not resolve PropertyFilter with id 'customFilter'; no FilterProvider configured; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not resolve PropertyFilter with id 'customFilter'; no FilterProvider configured

我做错了什么,我该如何纠正?

我的文件夹结构是:
src/main/java/com/a/b/c/Application.java
src/main/java/com/a/b/c/controller/ControllerA.java

src/test/java/com/a/b/c/controller/IntegrationTest.java

【问题讨论】:

    标签: spring-boot jackson spring-boot-test


    【解决方案1】:

    我通过在主应用程序文件中以稍微不同的方式配置Jackson2ObjectMapperBuilder 来实现此功能,如下所示。但我仍然不知道为什么自动装配方法不起作用。

    @Bean
    public Jackson2ObjectMapperBuilder objectMapperBuilder() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.filters( new SimpleFilterProvider().addFilter( "customFilter", new ExampleFilter() ) );
        return builder;
    }
    

    我仍然想知道,在测试环境中,为什么自动配置的Jackson2ObjectMapperBuilder 没有被选中进行自定义,而将其替换为@Bean 有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 2019-08-27
      • 2016-01-30
      • 2012-08-04
      相关资源
      最近更新 更多