简体   繁体   English

与Spring一起验证bean

[英]bean validation together with Spring

Tomcat application, and I use Spring for dependency injection. Tomcat应用程序,我使用Spring进行依赖注入。 I also use Jersey for rest calls, now I need to do some bean validation. 我还使用Jersey进行休息调用,现在我需要做一些bean验证。 I found examples that it is easy to to if I were using Spring MVC @RequestMapping for rest calls. 我找到了一些例子,如果我使用Spring MVC @RequestMapping进行休息调用很容易。 But using Jersey and hibernate validator together things got ugly. 但是使用Jersey和hibernate验证器一起变得很丑陋。

@POST
@Path("/addSomething")
public void addSomething(Something something) {

    Set<ConstraintViolation<Something>> violations = validator.validate(something);
    if(violations.size()>0){
        throw new BadRequestException("illegal input");
    }

   ..
}

This works, but I need to repeat this for every post request. 这有效,但我需要为每个帖子请求重复此操作。 Which is ugly. 这很难看。

Is there a way to neatly handle bean validation here? 有没有办法整齐地处理bean验证?

You could improve it a bit by having a generic validate method that takes an Object as parameter, eg: 您可以通过使用将Object作为参数的通用验证方法来改进它,例如:

public static void validateBean(Object object) {
    Set<ConstraintViolation<Object>> violations = validator.validate(object);
    if(violations.size()>0){
        throw new BadRequestException("illegal input");
    }
}

Then you just have to call validateBean(someObject); 然后你只需要调用validateBean(someObject); at the beginning of each post method. 在每个帖子方法的开头。

What about use also contrainst groups XD. 那么使用也是对抗组XD。

public void validateEntity(final Object object, final Class<? extends Default>... classes)
        throws IllegalArgumentException {
    final Set<ConstraintViolation<Object>> errors = validator.validate(object, classes);
    if (!errors.isEmpty()) {
        throw new IllegalArgumentException(returnErrors(errors));
    }
}


public String returnErrors(final Set<ConstraintViolation<Object>> errors) {
    final StringBuilder builder = new StringBuilder();
    for (final ConstraintViolation<Object> error : errors) {
        builder.append(error.getMessage());
    }
    return builder.toString();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM