自定义注释Spring MVC ResultBinding

时间:2014-01-21 18:30:27

标签: java spring spring-mvc

我有一个简单的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的验证服务。

有什么方法可以处理这个并访问绑定结果并在方面抛出此异常时添加错误消息?

2 个答案:

答案 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)

回答你的问题可能为时已晚,但有两种方法可以处理:

  1. 尝试在您的方面捕获proceed(),当您获得运行时异常时,您可以从方面返回响应(如显示错误原因的通用JSP或带有错误消息的通用JSON。)
  2. 第二个选项可能是使用Spring Exception Handler Controller建议。 Spring MVC提供了很好的异常处理程序控制器机制来为给定类型的异常类调用特定的处理程序方法。 (这是博客链接:https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc
  3. 我们目前有一个应用程序,我们使用这种方法的混合来处理异常。