@@不适用于弹簧托控制器

问题描述 投票:0回答:1

我已将其他终结点方法定义为:

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

这将请求参数映射到MyObject。

[MyObject被定义为(带有lombok,javax.validation注释):

@Value
@AllArgsConstructor
public class MyObject {

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

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

}

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

spring-boot rest lombok javax.validation
1个回答
0
投票

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

  • 获取:获取有关资源的信息。
  • 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;
}

@PostMapping("/point")
public ResponseEntity savePoint(@RequestBody @Valid MyObject myObject) {...}

我将解释更改:

  • 添加@PostMapping以符合REST标准。
  • 添加@RequestBody,此批注获取发送到服务器的信息,并使用它来创建MyObject对象。
  • 将@NoArgsConstructor添加到MyObject,默认情况下,反序列化使用默认的构造函数(不带参数)。您可以编写一些专门的代码来使这些东西在没有默认构造函数的情况下工作,但这取决于您。
© www.soinside.com 2019 - 2024. All rights reserved.