首页 > 解决方案 > 如何使任何一个请求参数都是强制性的,例如其中一个可以为 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但是我不想这样做。

标签: springspring-mvcspring-bootcontroller

解决方案


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

推荐阅读