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 只调用两个配置之一 类 并且不注册自定义反序列化器。
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 只调用两个配置之一 类 并且不注册自定义反序列化器。