У меня есть сервер Springboot, на котором я использую webflux. Я переопределил Jackson ObjectMapper по умолчанию, установив распознаватель типов по умолчанию, но когда кодировщик Flux не работает должным образом:
// Configuration.java
@Configuration
public class Configuration {
@Bean
Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
TypeResolverBuilder<?> typeResolver =
new ObjectMapper.DefaultTypeResolverBuilder(DefaultTyping.NON_FINAL).init(Id.CLASS, null)
.inclusion(As.PROPERTY);
return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder
.defaultTyping(typeResolver);
}
}
// Controller.java
@RestController
public class Controller {
@Autowired
ObjectMapper mapper;
@GetMapping(value = "/flux")
public Flux<Boolean> getFlux() throws Exception {
System.err.println(mapper.writeValueAsString(true)); // prints "true" : OK
return Flux.just(true); // Not returning "true" on the browser
}
}
Когда я тестирую конечную точку с помощью браузера, я получаю следующее:
["org.springframework.web.servlet.mvc.method.annotation.ReactiveTypeHandler $ CollectedValuesList", [true]]
Очевидно, что десериализация неверна, не только она не должнаt включает тип (потому что boolean - это конечный класс), но представление также является неправильным (включается как массив).
Когда я удаляю конфигурацию Джексона, я получаю в браузере true как вывод, который является правильным
- Spring boot version: 2.1.2.RELEASE
- Java-версия: 8