使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));
}