spring异常通知报错At least one handler method must be found in class [class aop.LogException]

本文解决了一个关于异常通知配置的问题,在AOP LogException类中因方法可见性设置不当导致系统无法识别异常处理方法。通过检查和调整方法的访问修饰符,成功解决了这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2019/3/30

问题描述
在编写好异常通知和配置文件之后运行测试类,出现了错误:
in thread “main” java.lang.IllegalArgumentException: At least one handler method must be found in class [class aop.LogException]

解决思路
该报错已经将错误定位到了编写异常通知的类当中,发现在本类中找不到错误。于是进入本类的接口类ThrowsAdvice中进行核对发现源码中有一下描述:

 * <pre class="code">void afterThrowing([Method, args, target], ThrowableSubclass);</pre>
 * <p>Some examples of valid methods would be:
 * <pre class="code">public void afterThrowing(Exception ex)</pre>
 * <pre class="code">public void afterThrowing(RemoteException)</pre>
 * <pre class="code">public void afterThrowing(Method method, Object[] args, Object target, Exception ex)</pre>
 * <pre class="code">public void afterThrowing(Method method, Object[] args, Object target, ServletException ex)</pre>

该段代码表示:

  1. 在接口实现类中必须按照格式编写
    void afterThrowing([Method, args, target], ThrowableSubclass)
    (中括号表示里面的参数要不全都存在,不要全都不存在!)
    2.给了几个例子例如
    public void afterThrowing(Exception ex)
    可以发现,自己根据1中格式编写的方法必须时public。

解决方法

经过核对之后,发现自己写的接口实现类中的方法没有加 public 加以修饰,于是加上 public,解决了错误。

### Java中HandlerMethod类的IllegalStateException异常问题分析 在Spring框架中,`java.lang.IllegalStateException: No primary or single unique constructor found for class` 异常通常与Spring如何实例化Bean有关。当Spring尝试通过反射机制实例化一个类时,如果该类没有提供明确的主构造函数或单一的构造函数,则会抛出此异常。 在提供的代码示例中[^1],`Checken` 和 `Egg` 类均使用了`@AllArgsConstructor`注解,这表明Lombok库将为这两个类生成包含所有字段的构造函数。然而,如果Spring需要实例化这些类并且无法找到唯一的构造函数时,可能会导致类似的问题。 此外,在引用[2]中提到,Spring容器在依赖注入完成后立即进行初始化回调,但此时AOP拦截器尚未生效。这意味着如果在初始化阶段涉及到复杂的构造逻辑(例如循环依赖或代理对象的创建),可能会引发不一致的状态或异常[^2]。 #### 问题原因分析 1. **构造函数冲突**:Spring要求被管理的Bean必须具有明确的实例化方式。如果一个类定义了多个构造函数且没有指定主构造函数,Spring将无法决定使用哪个构造函数。 2. **循环依赖**:如示例中的`Checken`和`Egg`类之间存在相互依赖关系,可能导致Spring无法正确解析依赖关系。 3. **AOP代理影响**:如果Bean涉及AOP代理,并且其构造逻辑复杂,可能会导致初始化阶段出现问题[^2]。 #### 解决方案 以下是几种可能的解决方案: 1. **明确指定主构造函数**: 使用`@RequiredArgsConstructor`或`@NoArgsConstructor`等Lombok注解,确保Spring能够找到明确的构造函数。 ```java @NoArgsConstructor @AllArgsConstructor public class Checken { private Egg egg; } @NoArgsConstructor @AllArgsConstructor public class Egg { private Checken checken; } ``` 2. **避免循环依赖**: 检查类之间的依赖关系,尽量避免直接的循环依赖。可以通过Setter注入或方法注入替代构造函数注入。 ```java public class Checken { private Egg egg; @Autowired public void setEgg(Egg egg) { this.egg = egg; } } public class Egg { private Checken checken; @Autowired public void setChecken(Checken checken) { this.checken = checken; } } ``` 3. **启用懒加载**: 如果循环依赖不可避免,可以尝试为其中一个Bean启用懒加载(lazy initialization),以推迟依赖解析的时间。 ```java @Component @Lazy public class Checken { private final Egg egg; public Checken(Egg egg) { this.egg = egg; } } ``` 4. **调整AOP配置**: 如果问题与AOP相关,可以检查是否需要调整代理模式(例如从JDK动态代理切换到CGLIB代理)。 #### 示例代码 以下是一个完整的示例,展示如何通过Setter注入避免构造函数冲突: ```java @Component public class Checken { private Egg egg; @Autowired public void setEgg(Egg egg) { this.egg = egg; } } @Component public class Egg { private Checken checken; @Autowired public void setChecken(Checken checken) { this.checken = checken; } } ``` ### 总结 `java.lang.IllegalStateException: No primary or single unique constructor` 异常的根本原因在于Spring无法确定如何实例化目标类。通过明确指定构造函数、避免循环依赖或启用懒加载等方式,可以有效解决此类问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值