我有一个简单的MVC控制器,我使用自定义注释进行注释:
@PreAuthorize("hasRole('GESTION_BENEFICIAIRE')")
@AuthentificationForte(otp = "#{args[0]}",transactionId="#{args[1]}")
@RequestMapping(value = "/ajouter", method = { RequestMethod.POST, RequestMethod.GET })
public String addBeneficiaire(@ModelAttribute("beneficiaireForm") BeneficiaireForm beneficiaireForm,
BindingResult result, Model model, Principal principal) {
[...]
}
我的自定义注释与在验证失败时抛出RuntimeException
的方面相关联。
@Around(value = "@annotation(annotation)")
public Object verifyOtp(final ProceedingJoinPoint jointPoint,
final AuthentificationForte annotation) throws Throwable {
try {
if (authentificationForteEnabled) {
[...]
} else {
throw new AuthentificationForteException();
}
} else {
return jointPoint.proceed();
}
} finally {
}
}
所以现在的行为是,当验证失败时,我被重定向到500错误页面。我的目标是留在同一页面,并向BindingResult
添加被拒绝的消息:
result.rejectValue("suiteRib", "BeneficiaireForm.InvalidRib");
我还没有找到办法做到这一点,我发现的唯一方法是更改我的所有逻辑而不使用注释,同时在控制器代码中使用带有try / catch的验证服务。
有什么方法可以处理这个并访问绑定结果并在方面抛出此异常时添加错误消息?
答案 0 :(得分:0)
绝对是。
这里有一个操纵args的例子: Aspectj overwrite an argument of a method
您还可以将服务自动装配到方面类中(记住将其标记为@Configurable)。
如果您事先知道了参数,那么我认为它们可以包含在切点定义中,在这种情况下,它们可以直接在around方法中引用。这是非常好的,因为参数强烈地类型。
您可以在此处阅读更多内容:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html
答案 1 :(得分:0)
回答你的问题可能为时已晚,但有两种方法可以处理:
我们目前有一个应用程序,我们使用这种方法的混合来处理异常。