【问题标题】:Reject api call requests with fields having leading or trailing spaces拒绝具有前导或尾随空格的字段的 api 调用请求
【发布时间】:2021-05-18 17:21:34
【问题描述】:

在 Spring 的 MVC 中,如果我有一个控制器并且我想拒绝任何带有带有前导或尾随空格的字段的 queryparam 或 requestbody 请求,那么最好的方法是什么?我们可以使用验证器吗?

    @PostMapping(value="/add")
    public ResponseEntity<User> addUser(@Validated(AddUser.class) @Requestbody User user, BindingResult result) {
        ...
        // Business logic here
        // How to check leading and trailing spaces and throw error if present
        ...
        return responseEntity;
    }

在上面说用户只有名字和姓氏作为字段,我想检查名字和姓氏都没有任何前导或尾随空格,如果有则抛出错误,最好的方法是什么?

【问题讨论】:

    标签: java spring validation spring-mvc


    【解决方案1】:

    您可以构建自己的自定义验证器注释:

    @Target({TYPE, FIELD, ANNOTATION_TYPE, TYPE_USE})
    @Retention(RUNTIME)
    @Constraint(validatedBy = NoSpacesValidator.class)
    @Documented
    public @interface NoSpaces {
        String message() default "Has trailing or leading spaces!";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    }
    
    
    
    public class NoSpaceValidator implements ConstraintValidator<NoSpace, String> {
    
    @Override
    public void initialize(final NoSpace constraintAnnotation) {
        // Empty as no initialize is necessary
    }
    
    @Override
    public boolean isValid(final String content, final ConstraintValidatorContext context) {
        return validate(content);
    }
    
    private boolean validate(final String content) {
    // I suck
        if (StringUtils.isBlank(content)) return false;
        return content.trim().length.equals(content.length)
    }
    }
    

    然后你可以用@NoSpace注释你的属性

    【讨论】:

    • Daniel,所以当这个验证器与这样的属性一起使用时 - @NoSpace @RequestBody User user - 它会检查用户对象的 firstName 和 lastName 字段?
    • 对不起。我的回答不够清楚。不,您需要在 User 类中注释相应的属性
    • 是的,当我再次阅读答案时,我想通了。谢谢丹尼尔
    【解决方案2】:

    我想我们也可以在 User 类字段上使用 javax.validation.constraints.Pattern

    @Pattern(regexp="^\\S.*\\S$")
    String firstName;
    
    @Pattern(regexp="^\\S.*\\S$")
    String lastName;
    

    【讨论】:

      猜你喜欢
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 2011-10-15
      • 2019-12-16
      相关资源
      最近更新 更多