Десериализация Springboot Webflux Джексона не работает - PullRequest
0 голосов
/ 11 октября 2019

У меня есть сервер 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
...