【问题标题】:Make Spring java object request parameter required使 Spring java 对象请求参数成为必需
【发布时间】:2018-04-30 12:05:34
【问题描述】:

我有以下控制器代码

@GetMapping("/users")
public ResponseEntity<UserDto> getUsers(Filter filter) {
    return ResponseEntity.ok(userService.findUsers(filter));
}

Filter.java:

public class Filter {
    private Integer page;

    private Integer size;

    private String sort;

    ... lots of other parameters
}

请求参数被写成Java对象,以避免向控制器添加大量参数。但是,Spring 将所有参数设为可选。我想要的是有一些像pagesize 这样的参数是必需的,但其他像sort 是可选的。如果我将它们作为控制器参数,我可以使用@RequestParam(required = true/false)。是否可以在 Java 类中做类似的事情?

【问题讨论】:

  • 你可以使用 kotlin 和默认参数 :) (这是一个玩笑,不是一个真正的建议;但如果你愿意,你可以这样做)

标签: java spring spring-boot http-request-parameters


【解决方案1】:

您可以使用 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));
}

如果过滤器参数不遵守约束,则会抛出 ConstraintViolationException,您可以使用 Spring 异常处理程序(例如 @ControllerAdvice)将其保留或捕获以将其映射到特定的客户端 4XX 错误。

【讨论】:

  • 谢谢,这几乎奏效了:ConstraintViolationException 不是 org.springframework.validation.BindException,而是带有很长的令人讨厌的错误消息
  • 不客气。您可以将整个堆栈跟踪粘贴到 pastebin 或任何允许这样做的网站中。
  • 在“@Valid Filter filter”之后添加一个“BindingResult bindingResult”,这样spring就有办法告诉你绑定错误
猜你喜欢
  • 2019-05-19
  • 2019-12-11
  • 2015-07-31
  • 1970-01-01
  • 2011-01-13
  • 2017-07-01
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多