提问者:小点点

@有效不为SpringRest控制器工作


我将Restendpoint方法定义为:

@GetMapping("/get")
public ResponseEntity getObject(@Valid MyObject myObject){....}

这将请求参数映射到MyObject。

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

@Value
@AllArgsConstructor
public class MyObject {

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

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

}

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


共3个答案

匿名用户

如果你使用Spring Boot的版本

验证启动器不再包含在Web启动器中

…你需要自己添加启动器。

对于Maven版本,您可以使用以下方式执行此操作:

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

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

dependencies {
  ...
  implementation 'org.springframework.boot:spring-boot-starter-validation'
}

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

匿名用户

使用org. springframe.validation.annotation.验证注释您的控制器

匿名用户

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

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

getObject中,您期望接收一个对象。根据REST标准的get方法意味着您想要检索一些数据,通常您发送一些包含在url中的数据,例如…/app-context/get/{id},这里id是一个参数,它告诉您的控制器您想要一些属于id的信息,因此如果您调用endpoint,例如…/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;
}
@PostMapping("/point")
public ResponseEntity savePoint(@RequestBody @Valid MyObject myObject) {...}

我将解释这些变化:

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