如何在控制器方法之前检查参数值格式?

时间:2016-06-01 05:18:46

标签: java spring spring-mvc spring-aop

在我的控制器中,我有一个方法,如下面的方法:

ipad

但是在执行这个方法之前,我必须在以下情况下进行讨论:

public QueryResult<TrsAccount> listExclude(String codeAccount, String searchFilter, String order, int pageNumber,
     int pageSize){}

因为这在我的应用程序中非常频繁,并且不仅仅是这种情况,我想要一种通用的方法来检查参数格式。我现在使用的方式是使用AOP,其中:

Assert.TRUE(codeAccount.matches("^[0-9]{1,20}$"));

正如您所看到的,这是一个非常基本且容易出错的代码段。有没有更好的解决方案??

3 个答案:

答案 0 :(得分:1)

不建议在控制器中使用AOP。一个更好的方法是to use JSR 303 / JSR 349 Bean Validation,但这可能需要将字符串包装在一个值对象中,然后相应地对其进行注释。

如果您坚持使用AOP解决此问题,you'll probably need a ControllerAdvice

答案 1 :(得分:0)

就像@Sean Patrick Floyd所说,使用Bean Validation更为可取。

首先,定义一个从org.springframework.validation.Validator延伸的类,如:

@Component
public class CodeAccountValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return String.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        if (Assert.isNotNull(target) && Assert.isNotEmpty((String) target)) {
            Assert.TRUE(((String) target).matches("^[0-9]{1,20}$"));
        }
    }
}

然后将@Validated注释添加到控制器中,如:

public QueryResult<TrsAccount> listExclude(
    @Validated(CodeAccountValidator.class)String codeAccount,
    String searchFilter,
    String order, int pageNumber,
    int pageSize) {
    ... ...
}

答案 2 :(得分:0)

尝试用AOP来解决这个问题是你不应该做的。而是使用对象绑定属性并验证该对象。

public class QueryCriteria {
    private String codeAccount;
    private String searchFilter;
    private int pageNumber;
    private int pageSize;
    private String order;
    // Getters / Setters.
}

然后修改您的控制器方法

public QueryResult<TrsAccount> listExclude(@Valid QueryCriteria criteria, BIndingResult result) { ... }

然后使用Spring Validator来验证你需要的东西。

public QueryCriteriaValidator implements Validator {

    private final Pattern ACCOUNT_EXPR = Pattern.compile("^[0-9]{1,20}$");

    public boolean supports(Class<?> clazz) {
       return QueryCriteria.isAssignable(clazz);
    }

    public void validate(Object target, Errors errors) {
        final QueryCriteria criteria = (QueryCriteria) target;
        if (!ACCOUNT_EXPR.matcher(criteria.getCodeAccount()).matches()) {
            errors.rejectValue("codeAccount", "invalid.format");
        }
    }
}

在控制器方法的@InitBinder中注册此验证器

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.setValidator(new QueryCriteriaValidator());
}

使用JSR-303时,您不需要这样做,您可以使用codeAccount注释简单地注释@Pattern字段。

@Pattern(regexp="^[0-9]{1,20}$")
private String codeAccount;

验证与Spring MVC以及使用I18N的错误报告很好地协同工作。因此,不要试图破解它与框架的异常工作。

我建议阅读Spring Reference指南的validation sectionbinding section