Spring webflux 不会用@ModelAttribute填充路径变量中的自定义对象



我正在尝试调整一个与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,但我无法想象没有一个自动化的解决方案可以让它再次工作,因为它一直与SpringWeb一起工作。

有人和我一样遇到过同样的问题吗?

谢谢,

朱利安

关于@ModelAttribute的Spring WebFlux参考文档没有提到URI路径变量,这与Spring MVC参考文档中的相同部分不同:

上面的Pet实例解析如下:

  • 如果已经使用model添加,则从模型中
  • 通过使用@SessionAttributes
  • 从通过Converter传递的URI路径变量(请参阅下一个示例(
  • 来自默认构造函数的调用
  • 通过调用具有以下参数的"主构造函数"与Servlet请求参数匹配。参数名称已确定通过JavaBeans@ConstructorProperties或通过保留的运行时字节码中的参数名称

在这一点上,这是预期的行为,这一选择背后可能有充分的理由或限制。请随意在Spring Framework中为此打开一个增强请求。

最新更新