在我的控制器中,我有一个方法,如下面的方法:
ipad
但是在执行这个方法之前,我必须在以下情况下进行讨论:
public QueryResult<TrsAccount> listExclude(String codeAccount, String searchFilter, String order, int pageNumber,
int pageSize){}
因为这在我的应用程序中非常频繁,并且不仅仅是这种情况,我想要一种通用的方法来检查参数格式。我现在使用的方式是使用AOP,其中:
Assert.TRUE(codeAccount.matches("^[0-9]{1,20}$"));
正如您所看到的,这是一个非常基本且容易出错的代码段。有没有更好的解决方案??
答案 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 section和binding section。