当前位置: 首页 > 知识库问答 >
问题:

自定义批注Spring MVC ResultBinding

郑宜民
2023-03-14

我有一个简单的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个答案

尉迟鑫鹏
2023-03-14

现在回答你的问题可能为时已晚,但有两种方法可以解决:

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

我们目前有一个应用程序,其中我们使用这种方法的混合来处理异常。

邹海荣
2023-03-14

非常肯定。

这里有一个操作参数的示例:Aspectj覆盖方法的参数

您还可以将服务自动连接到方面类中(记住将其标记为@Configurable)。

如果您事先知道这些参数,那么我认为它们可以包含在点切割定义中,在这种情况下,可以在around方法中直接引用它们。这是更好的,因为参数是强类型的。

您可以在此处阅读更多内容:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html

 类似资料:
  • 我正在创建一个后spring web服务endpoint,并使用一个Object,其中包含大约7-8个String变量和其他变量。在验证请求时,我需要对每个条件进行相同的测试,例如- < li >条件1如果为真,则继续,否则抛出异常。 < li >条件2如果为真,则继续,否则抛出异常。 < li >条件3如果为真,则继续,否则抛出异常 3-4更多业务逻辑验证就像上面一样,有很多if-else,一种

  • 使用 Vim 编辑 Shell 脚本,在进行调试时,需要进行多行的注释,每次都要先切换到输入模式,在行首输入注释符"#"再退回命令模式,非常麻烦。 连续行的注释其实可以用替换命令来完成。换句话说,在指定范围行加"#"注释,可以使用 ":起始行,终止行 s/^/#/g",例如: :1,10s/^/#/g 表示在第 1~10 行行首加"#"注释。"^"意为行首;"g"表示执行替换时不询问确认。如果希望

  • 问题内容: 我正在尝试创建将影响序列化值的自定义杰克逊注释。 含义: 现在序列化对象X(10)将导致: 我该如何实现? 问题答案: 结果:

  • 问题内容: 根据这个答案:http://codingdict.com/questions/137507 我写了这样的序列化器: 如果注释存在且字段为,则女巫应该写字符串“ N / A” 。但是仅对非空字段调用方法。 另外,我尝试致电: 通过这样的实现: 但是没有结果。 如何以这种方式处理空字段? 更新资料 根据讨论:https : //github.com/FasterXML/jackson- d

  • 在META-INF/Services中,添加了javax.annotation.processing.processor条目,指定自定义注释处理器类。

  • 前面我们学习了 Java 的基本注解和元注解,如果这两种注解不能满足你的需求,可以自定义注解。下面介绍如何自定义注解。 声明自定义注解使用 @interface 关键字(interface 关键字前加 @ 符号)实现。定义注解与定义接口非常像,如下代码可定义一个简单形式的注解类型。 上述代码声明了一个 Test 注解。默认情况下,注解可以在程序的任何地方使用,通常用于修饰类、接口、方法和变量等。