Spring webflux не заполняет пользовательский объект из переменных пути с помощью @ModelAttribute - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь адаптировать приложение, которое хорошо работает с Spring MVC, но имеет другое поведение с Spring WebFlux

Вот мой код с Spring Boot 5 - Spring MVC:

Контроллер:

@RestController
public class MyRestController {

    @GetMapping("/test/{id}/{label}")
    public ResponseEntity<Payload> test(@ModelAttribute Payload payload) {
        return new ResponseEntity<>(payload,HttpStatus.OK);
    }
}

Объект Payload:

public class Payload {

    @NotNull
    private int id;

    private String label;

    public Payload() {}

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

Мой pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.0.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

Я не написал никакого специального конвертера, Spring заполняет мой объект полезной нагрузки автоматически, все в порядке.

Когда я звоню:

http://localhost:8080/test/25/helloWorld

Ответ

{"id":25,"label":"helloWorld"}

Затем я меняю только свой pom.xml, переключаясь с web на webflux:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.0.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
</dependencies>

И мой полезный объект больше не заполнен.

Когда я звоню:

http://localhost:8080/test/25/helloWorld

Ответ

{"id":0,"label":null}

Я знаю, что мог бы написать конвертер и зарегистрировать его в @ControllerAdvice, но я не могу себе представить, что не существует автоматизированного решения, которое могло бы заставить его работать снова, как это всегда работало с Spring Web.

Кто-нибудь уже сталкивался с той же проблемой, что и я?

Спасибо

Julien

1 Ответ

0 голосов
/ 12 ноября 2018

Справочная документация Spring WebFlux о @ModelAttribute не содержит переменных пути URI, в отличие от того же раздела в справочной документации для Spring MVC :

Приведенный выше экземпляр Pet разрешается следующим образом:

  • Из модели, если она уже добавлена ​​с использованием модели.
  • Из сеанса HTTP с помощью @SessionAttributes.
  • Из переменной пути URI, переданной через конвертер (см. Следующий пример).
  • Из вызова конструктора по умолчанию.
  • От вызова «первичного конструктора» с аргументами, которые соответствует параметрам запроса сервлета. Названия аргументов определены через JavaBeans @ConstructorProperties или через время выполнения имена параметров в байт-коде.

На данный момент это ожидаемое поведение, и за этим выбором могут быть веские причины или ограничения. Не стесняйтесь открыть запрос расширения в Spring Framework для этого .

...