为Spring WebTestClient手动配置Jackson模块

时间:2018-07-25 07:20:42

标签: spring spring-boot jackson geojson spring-webflux

先决条件

  • Spring Boot:2.0.3.RELEASE
  • Spring REST Docs:2.0.1.RELEASE
  • Spring Auto REST文档:2.0.2-SNAPSHOT-这是current master的本地版本。

GeoJsonModule在主应用程序中配置:

import org.springframework.data.mongodb.core.geo.GeoJsonModule;

@SpringBootApplication
public class MyApplication {
    [...]
    @Bean
    public GeoJsonModule registerGeoJsonModule() {

        return new GeoJsonModule();
    }
    [...]
}

我正在使用Spring Auto REST Docs,因此无法使用@AutoConfigure注释(或者至少我不知道如何使用)。

当前实施

我像这样配置WebTestClient:

WebTestClient
    .bindToApplicationContext(context)
    .configureClient()
    .filter(
        WebTestClientRestDocumentation
            .documentationConfiguration(restDocumentation)
            .snippets()
            .withDefaults(
                WebTestClientInitializer.prepareSnippets(context),
                CliDocumentation.curlRequest(),
                HttpDocumentation.httpRequest(),
                HttpDocumentation.httpResponse(),
                AutoDocumentation.requestFields(),
                AutoDocumentation.responseFields(),
                AutoDocumentation.pathParameters(),
                AutoDocumentation.requestParameters(),
                AutoDocumentation.description(),
                AutoDocumentation.methodAndPath(),
                AutoDocumentation.section()
            )
    )
    .build();

但是,当像这样使用WebTestClient时,出现以下错误:

org.springframework.core.codec.CodecException: Type definition error: [simple type, class org.springframework.data.mongodb.core.geo.GeoJsonPoint]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.springframework.data.mongodb.core.geo.GeoJsonPoint` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: com.example.MyClass["location"])

所以我环顾四周,发现WebTestClientAutoConfigurationSpringBootWebTestClientBuilderCustomizeradditionally customizing Codecs

更改初始化以包括定制程序可以解决反序列化问题,并且可以解决此问题。

Collection<CodecCustomizer> customizers = context.getBeansOfType(CodecCustomizer.class).values();

SpringBootWebTestClientBuilderCustomizer builderCustomizer = new SpringBootWebTestClientBuilderCustomizer(customizers);
builderCustomizer.customize(builder);
builder.build();

但是,我不知道这是否是配置WebTestClient的正确方法,并且它是否可以完全正常工作,或者是否仍然有问题,我才发现。

以某种方式我不认为这是预期的方式,我想知道如何正确配置WebTestClient。

0 个答案:

没有答案