Spring Spring 引导升级 2.4->2.5 后引导注册自定义 jackson(多边形)解串器

Spring Boot register custom jackson (polygon) deserializer after Spring Boot upgrade 2.4->2.5

TLDR;我如何告诉 spring 使用我的自定义解串器? (是的,我查过了,但它是 fubar)

我有一个 PostMapping 配备了一个多边形作为 RequestBody 参数; 它需要一组数组(包含点)并将它们转换为 org.elasticsearch.geometry.Polygon

@PostMapping(value = "/search", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<List<SearchDTO>> findSpatialResults(@RequestBody Polygon polygon) {...}

因为这需要一个自定义解串器,就是这样;

public class PolygonDeserializer extends StdDeserializer<Polygon> {

    public PolygonDeserializer() {
        super(Polygon.class);
    }

    @Override
    public Polygon deserialize(JsonParser jp, DeserializationContext context)
            throws IOException {
        ObjectCodec oc = jp.getCodec();
        JsonNode node = oc.readTree(jp);
      ...
    }
}

注册在 @Configuration 注释 Spring 配置 class;

@Configuration
public class SpringConfig {

    @Bean
    public Module polygonDeserializer() {
        SimpleModule module = new SimpleModule();
        module.addDeserializer(Polygon.class, new PolygonDeserializer());
        return module;
    }
}

在更新 Spring 之前这是有效的,现在我得到一个 JSON parse error: Cannot deserialize instance of `org.elasticsearch.geometry.Polygon` out of START_ARRAY token 并且无法弄清楚为什么。

我使用了两个 @configuration 注释 类。

通过将第一个配置 (WebConfig.class) 添加到 SpringConfig.class 并将其注册为 Bean 来修复;

@Configuration
public class SpringConfig {

    @Bean
    public ModelMapper modelMapper() {
        return new ModelMapper();
    }

    @Bean
    public WebConfig webConfig() {
        return new WebConfig();
    }

    @Bean
    public Module polygonDeserializer() {
        SimpleModule module = new SimpleModule();
        module.addDeserializer(Polygon.class, new PolygonDeserializer());
        return module;
    }
}

更改前的第二个配置;

@EnableWebMvc
@Configuration //<---- **Issue**
public class WebConfig implements WebMvcConfigurer {

    ...

    @Override
    public void addCorsMappings(CorsRegistry registry) {
    ...
    }
}

Spring 只调用两个配置之一 类 并且不注册自定义反序列化器。