我正在尝试调整一个与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中为此打开一个增强请求。