spring - 如何使任何一个请求参数都是强制性的,例如其中一个可以为 NULL,但不能同时为两者?
问题描述
我在弹簧控制器中有一个方法
@GetMapping
public ResponseEntity<RetailerCandidateFormResponse> getRetailerCandidateForm(
@RequestParam String a, @RequestParam String b, @RequestParam String c) {
//Method body goes here
}
我希望@Requestparam A a
是强制性的,可以通过@Requestparam(required=true) A a
或保持原样来实现,这是@Requestparam
注释的默认行为。
但是,如果我想要做一个@RequestParam String b
或@RequestParam String c
强制性的,即如果@RequestParam String b
请求中存在,则@RequestParam String c
不需要存在,反之亦然,但两者不能null
同时存在。如何在控制器级别实现这一目标?
在方法体内,我可以编写这个if-else-if
逻辑,如果两个参数都是,我可以抛出异常,null
但是我不想这样做。
解决方案
您可以使用 @ModelAttribute 从类中获取请求参数。您的网址将是:?a=&b=&c=
这是解决方案:
在控制器类之前使用@Validated。
@GetMapping
public ResponseEntity<RetailerCandidateFormResponse> getRetailerCandidateForm(
@Valid @ModelAttribute ReqParam reqParam) {
//Method body goes here
}
请求类:
public class ReqParam implements Serializable {
private static final long serialVersionUID = 1L;
@NotEmpty(message = "A can not be null")
private String a;
private String b;
private String c;
@AssertTrue(message = "B or c need to be present")
public boolean isValid() {
if (b == null) {
return c != null;
}
if (c == null) {
return b != null;
}
return true;
}
//getter seeter
}
推荐阅读
- reactjs - 登录后如何重定向到 ReactJs 中的另一个页面
- gitlab-ci - 如何配置 Gitlab-CI 服务?
- google-cloud-platform - 使用 Cypress 测试网站,但无法通过 google 2 因素身份验证
- c# - 如何在 WPF 应用程序中使用来自 ole32.dll 的游标?
- powershell - 如果结果与字符串匹配,如何从 PowerShell 获得真/假结果?
- python - ValueError:形状必须为 4 级,但对于 '{{node Conv2D_5}} 为 0 级,tf.nn.conv2d
- mysql - 从连接的 mysql 5.X 表中的每一行中至少获取最后 2 行
- web - twitter.com 如何使 JPEG 个人资料图像透明?
- javascript - 创建一个函数来打印带有 Jprompt 的答案
- gitlab - MR 打开时只运行一次 Gitlab CI 作业