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

如何通过注释使用试捕获来包装方法?

袁秦迟
2023-03-14

如果在方法调用中忽略了一个异常,我们可以这样写:

public void addEntryIfPresent(String key, Dto dto) {
   try {
        Map<String, Object> row = database.queryForMap(key);
        dto.entry.put(row);
   } catch (EmptyResultDataAccessException e) {}
}

我正在尝试编写一个自定义的Spring注释,它具有相同的效果,但可以只应用于方法头。这可能看起来类似于以下内容:

@IgnoreException(EmptyResultDataAccessException.class) //this annotation does not exist
public void addEntryIfPresent(String key, Dto dto) {
   Map<String, Object> row = database.queryForMap(key);
   dto.entry.put(row);
}

如何创建这样的注释?

共有1个答案

袁开宇
2023-03-14

这里有一种使用AspectJ的方法。

首先,定义方法级注释。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface IgnoreRuntimeException{

}

然后,定义注释的环绕特征。

@Component
@Aspect
public class ExceptionHandlingAdvice {

    @Around("@annotation(com.yourpackage.IgnoreRuntimeException) && execution(* *(..))")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
        Object returnObject = null;
        // do something before the invocation
        try {
            // invoke method
            returnObject = joinPoint.proceed();
            // do something with the returned object
            return returnObject;
        } catch (Exception e) {
            // do something with the exception
        }
    }

}

然后,可以在方法顶部应用注释以忽略异常。

@IgnoreRuntimeException
public void addEntryIfPresent(String key, Dto dto) {
    // ...
}

您还可以使用< code>ProceedingJoinPoint的api来检查注释的参数,以便只忽略您想要忽略的异常。

 类似资料:
  • 问题内容: 有什么方法可以通过JPA注释指定SQL注释?表和列的注释。 问题答案: 有什么方法可以通过JPA注释指定SQL注释?表和列的注释。 否。如果要定义表和列注释,最好的选择是在生成的DDL中根据事实进行操作,然后再对数据库执行操作。

  • 如果我在spring的控制器中有一个映射,比如: 我可以做一个注释,并将默认值10封装在上面吗?比如: 让spring像预期的那样理解我的注释。我发现https://stackabuse.com/spring-annotations-requestmapping-and-its-variants/当我看到他们用@GetMapping、@PostMapping等工具所做的事情时,我有点满怀希望。 但

  • 问题内容: 我使用我的uuid如下: 但是我收到了一个聪明的Hibernate警告: 使用org.hibernate.id.UUIDHexGenerator不会生成符合IETF RFC 4122的UUID值;考虑改用org.hibernate.id.UUIDGenerator 所以我想切换到,现在我的问题是如何将其告知Hibernate的生成器。我看到有人用它作为“hibernateuuid”-这

  • 在我的方面方法中,我需要获取name(自定义注释的参数)的值 由用户调用的方法:

  • 问题内容: 我创建了一个简单的注释类: 我在像这样的一些类中使用它: 我知道我可以遍历声明的字段并获得如下注释: 如何在不迭代类的声明字段的情况下直接通过带注释的名称获取字段? 问题答案: 如果需要进行多次访问,则可以预处理注释。

  • 问题内容: 我试过了 : 它返回了3列“ TABLE_NAME”,“ TABLE_TYPE”和“ COMMENTS”,但是“ TABLE_NAME”列就像“ encrypted”一样,我需要明确的表名: 我使用TABLE_NAME时未“加密”。 问题答案: 由于10g,Oracle在发出DROP TABLE语句时不会立即删除表。相反,它像这样重命名它们并将它们放入回收站。这使我们能够恢复原本不想删