@Valid 不适用于弹簧休息控制器

Man*_*oid 5 rest lombok spring-boot javax.validation

我将休息端点方法定义为:

@GetMapping("/get")
public ResponseEntity getObject(@Valid MyObject myObject){....}
Run Code Online (Sandbox Code Playgroud)

这会将请求参数映射到 MyObject。

MyObject 定义为(带有 lombok、javax.validation 注释):

@Value
@AllArgsConstructor
public class MyObject {

    @Min(-180) @Max(180)
    private double x;

    @Min(-90) @Max(90)
    private double y;

}
Run Code Online (Sandbox Code Playgroud)

但验证不起作用。即使值超出规定范围,请求也不会抛出错误并且进展顺利。

小智 6

如果您使用的是 Spring Boot > 2.3 的版本,它现在会显示

\n
\n

验证启动器不再包含在网络启动器中

\n

...你\xe2\x80\x99需要自己添加启动器。

\n
\n

IE

\n

对于 Maven 构建,您可以使用以下命令来完成此操作:

\n
<dependency>\n  <groupId>org.springframework.boot</groupId>\n  <artifactId>spring-boot-starter-validation</artifactId>\n</dependency>\n
Run Code Online (Sandbox Code Playgroud)\n

对于 Gradle,您需要添加如下内容:

\n
dependencies {\n  ...\n  implementation \'org.springframework.boot:spring-boot-starter-validation\'\n}\n
Run Code Online (Sandbox Code Playgroud)\n

请参考https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3-Release-Notes#validation-starter-no-longer-included-in-web-starters

\n


xii*_*vil 1

我在这里看到一些你应该解决的问题。让我们开始讨论 REST 标准,第一条规则是将端点视为资源的表示,而不是操作,例如,在您的代码中,我假设该类MyObject代表一个点(您应该重构该类以拥有适当的名称) ,那么 的路径值getObject可以是“ /point ”。这些操作被映射到 HTTP 方法上,相应地:

  • GET:获取有关资源的信息。
  • POST:创建资源。
  • PUT:更新资源。
  • 删除:删除资源。

你期望getObject收到一个物体。根据REST标准的get方法意味着你想要检索一些数据,通常你发送一些包含在url中的数据,如../app-context/get/{id},这里的id是一个参数,告诉你的控制器您想要一些属于某个 id 的信息,因此如果您调用 ../app-context/get/1 之类的端点来获取由数字 1 标识的某个域对象的信息。

如果要向服务器发送数据,最常见的 HTTP 方法是 POST。

据此,在设计层面你应该:

  • 为 MyObject 类指定一个有意义的名称。
  • 检查您要在 中进行的操作getObject
  • getObject分配表示资源的路径。

在代码级别,使用上述注释,您可以将其更改为:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyObject {

  @Min(-180) @Max(180)
  private double x;

  @Min(-90) @Max(90)
  private double y;
}
Run Code Online (Sandbox Code Playgroud)
@PostMapping("/point")
public ResponseEntity savePoint(@RequestBody @Valid MyObject myObject) {...}
Run Code Online (Sandbox Code Playgroud)

我将解释这些变化:

  • 添加 @PostMapping 以满足 REST 标准。
  • 添加@RequestBody,此注释获取发送到服务器的信息并使用它来创建 MyObject 对象。
  • 将 @NoArgsConstructor 添加到 MyObject,默认情况下,反序列化使用默认构造函数(不带参数)。您可以编写一些专门的代码来使事情在没有默认构造函数的情况下工作,但这取决于您。