使SpringJava对象请求参数为必需
我有以下控制器代码使SpringJava对象请求参数为必需,java,spring,spring-boot,http-request-parameters,Java,Spring,Spring Boot,Http Request Parameters,我有以下控制器代码 @GetMapping("/users") public ResponseEntity<UserDto> getUsers(Filter filter) { return ResponseEntity.ok(userService.findUsers(filter)); } 请求参数作为Java对象编写,以避免向控制器添加大量参数。但是,所有参数都由Spring设置为可选。我想要的是一些参数,如页面和大小是必需的,但另一些参数,如排序是可选的。如果将它们
@GetMapping("/users")
public ResponseEntity<UserDto> getUsers(Filter filter) {
return ResponseEntity.ok(userService.findUsers(filter));
}
请求参数作为Java对象编写,以避免向控制器添加大量参数。但是,所有参数都由Spring设置为可选。我想要的是一些参数,如
页面
和大小
是必需的,但另一些参数,如排序
是可选的。如果将它们作为控制器参数,我可以使用@RequestParam(required=true/false)
。可以在Java类中执行类似的操作吗?您可以使用javax.validation API指定类字段上的一些约束。在您的情况下,您可以根据您的要求和字段类型使用
@NotNull
和@NotEmpty
,例如:
import javax.validation.constraints.NotNull;
import javax.validation.constraints.NotEmpty;
...
public class Filter {
@NotNull
private Integer page;
@NotEmpty
private Integer size;
private String sort;
... lots of other parameters
}
然后为要验证的参数指定@Valid
注释:
import javax.validation.Valid;
...
@GetMapping("/users")
public ResponseEntity<UserDto> getUsers(@Valid Filter filter) {
return ResponseEntity.ok(userService.findUsers(filter));
}
import javax.validation.Valid;
...
@GetMapping(“/users”)
公共响应getUsers(@Valid Filter){
返回ResponseEntity.ok(userService.findUsers(filter));
}
如果筛选器参数不遵守约束,则会抛出一个
ConstraintViolationException
,您可以通过使用Spring异常处理程序(如@ControllerAdvice
)将其保留或捕获以将其映射到特定的客户端4XX错误 您可以使用kotlin和默认参数:)(这是一个笑话,不是一个真正的建议;但如果您愿意,您可以这样做)谢谢,这几乎奏效了:这里没有ConstraintViolationException
,而是一个org.springframework.validation.BindException
,带有一条很长的错误消息,欢迎您。您可以将整个stacktrace粘贴到pastebin或任何允许粘贴的网站上。在“@Valid Filter Filter”之后添加一个“BindingResult BindingResult”,这样spring就可以告诉您绑定错误
import javax.validation.Valid;
...
@GetMapping("/users")
public ResponseEntity<UserDto> getUsers(@Valid Filter filter) {
return ResponseEntity.ok(userService.findUsers(filter));
}