#spring-webflux #project-reactor #reactive-streams
Вопрос:
У меня есть следующий маршрут в моем приложении
@Bean
public RouterFunction<ServerResponse> route(UserHandler handler) {
return RouterFunctions.route(RequestPredicates.POST("/users"), handler::signup);
}
который обрабатывается следующим методом
public Mono<ServerResponse> signup(ServerRequest request) {
return request
.bodyToMono(User.class)
.map(user -> {
user.setPassword(encoder.encode(user.getPassword()));
return user;
})
.flatMap(repository::save)
.map(user -> tokenService.create(user.getId()))
.map(TokenDto::new)
.flatMap(tokenDto -> ServerResponse.ok().body(tokenDto, TokenDto.class));
}
Когда я отправляю допустимый запрос на конечную точку, регистрируется следующая ошибка
'producer' type is unknown to ReactiveAdapterRegistry
Исследовав проблему с помощью отладчика, я вижу, что метод регистрации моего обработчика успешно завершен, поэтому я предполагаю, что маршрутизатору не нравится возвращаемое значение, но я не уверен, почему?
Комментарии:
1. Когда я использую
ServerResponse.ok()
, я обычно добавляю.contentType(MediaType.APPLICATION_JSON)
(или другой тип контента) раньше.body
. Вам разрешено это делать в вашем случае?2. Спасибо, я пропустил это, но, к сожалению, это не решило проблему
3. Я бы попытался разделить код, создав пользователя в другом вложенном конвейере, а затем вызвав
return ServerResponse.ok().body(tokenDto, TokenDto.class);
его . Кстати, я не понимаю, как вы создаете новый токен на основе пользователя, если вы не передаете пользователя по адресу.map(TokenDto::new)
.4. Новый токен создается на основе идентификатора пользователя
user -> tokenService.create(user.getId())
, затем возвращенный JWS используется для создания экземпляраTokenDto
, который впоследствии возвращается клиенту.