在Spring Boot中添加服务器端动态验证

时间:2018-09-19 09:38:07

标签: spring-mvc spring-boot

我正在使用Spring Boot2。我想在服务器端添加某些动态验证,这些验证应在POST REST调用中执行。可以在POST方法调用的参数级别以注释的形式添加这些验证吗?

2 个答案:

答案 0 :(得分:0)

下面的代码将帮助您实现服务器端验证。

Pojo类:

public class Data {
    @NotNull
    private final String someStringValue;
    @Min(1)
    private final int someIntValue;

    @JsonCreator
    public Data(@JsonProperty("someStringValue") String someStringValue, @JsonProperty("someIntValue") int someIntValue) {
        this.someStringValue = someStringValue;
        this.someIntValue = someIntValue;
    }

    public String getSomeStringValue() {
        return someStringValue;
    }

    public int getSomeIntValue() {
        return someIntValue;
    }

为了进行验证,我们需要一个包含逻辑的自定义类:

@Component
public class StringValueValidator {

    public void validate(String language, Data data, Errors errors) {
        if (!"de-DE".equals(language)) {
            if (data.getSomeStringValue().length() > 140) {
                errors.reject("someStringValue");
            }
        }
    }
}

控制器方法:

@RequestMapping(value = "/validation", method = RequestMethod.POST)
    public ResponseEntity<?> acceptData(@Valid @RequestBody Data data, Errors errors, 
        @RequestHeader(HttpHeaders.ACCEPT_LANGUAGE) String language) {
        stringValueValidator.validate(language, data, errors);
        if (errors.hasErrors()) {
            return new ResponseEntity<>(createErrorString(errors), HttpStatus.BAD_REQUEST);
        }
        return new ResponseEntity<>(HttpStatus.OK);
    }

请参阅:https://blog.codecentric.de/en/2017/11/dynamic-validation-spring-boot-validation/

答案 1 :(得分:0)

这是在从客户端收到的RequestBody中定义验证的方法。

  1. 定义您将从客户端收到的POJO。

     public class Employee implements Serializable {
    
      private Long id;
    
      @NotNull(message = "Name should not be null")
      @NotBlank(message = "Name should be not empty")
      @Size(min = 1, max = 255, message = "Name allowed max 255 characters")
      private String name;
    

现在,在您的控制器中,为@Valid使用@RequestBody注释,如下所示。

public ResponseEntity<?> createEmployee(@Valid @RequestBody Employee employee)