Spring Boot WebFlux Converter - PullRequest
       13

Spring Boot WebFlux Converter

0 голосов
/ 09 ноября 2019

Я пытаюсь перенести свой проект из Spring MVC в Spring WebFlux. Я сейчас использую репозиторий ReactiveCrudRepository. Чтобы получить шаблон post-redirect-get , который я использовал в Spring MVC, мне нужно переписать текущий конвертер для работы с ReactiveCrudRepository.

. Я пыталсясделать это следующим образом:

@Component
public class ObjByIdConverter implements Converter<String, Obj> {

    @Autowired
    private IObjRepository objRepository;

    @Override
    public Obj convert(String id) {
        return objRepository.findById(id).block();
    }
}

Когда я реализую конвертер таким образом, я получаю следующую ошибку: block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-xxx. Когда я использовал CrudRepository вместо ReactiveCrudRepository, все работало нормально.

Есть ли способ реализовать конвертер для работы с ReactiveCrudRepository?

~~~ Редактировать1 ~~~

Класс контроллера:

@PostMapping
public Mono<String> processOrder(@ModelAttribute("newCar") Car car) {

    webDataBinder.validate();
    BindingResult bindingResult = webDataBinder.getBindingResult();

    if (bindingResult.hasErrors()) {
        return Mono.just("orderForm");
    }

    return this.carRepository.save(car).thenReturn("redirect:/");
}

Класс модели:

@Document(collection = "cars")
@ToString
@EqualsAndHashCode
public class Car {
    @Id
    private String id;
    private List<Obj> objs = new ArrayList<>();

    // constructor, getters, setters, ...
}

Я использую технологию просмотра Thymeleaf.

Я должен предоставить реализацию для ObjByIdConverter, потому что я получаю следующее сообщение об ошибке: [Failed to convert property value of type 'java.lang.String' to required type 'java.util.List' for property 'objs'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'com.example.app.model.Obj' for property 'objs[0]': no matching editors or conversion strategy found]

1 Ответ

0 голосов
/ 10 ноября 2019

Вы не должны использовать block в любом случае в реактивной разработке. Если у вас есть ReactiveRepository и Spring Webflux, используйте их вместе с Mono / Flux из репозитория в контроллер, чтобы использовать реактивный способ работы.

Но я думаю, что основная причина, по которой вы пытаетесь преобразовать результат в стандартный тип, заключается в post-redirect-get pattern, не могли бы вы подробно описать это в контексте контроллера пружины?

...