Spring切面编程错误warning no match for this type name:com.xxx.xxx [Xlint:invalidAbsoluteTypeName]

本文详细解析了AOP切面表达式的使用方法,包括如何精确匹配目标类和方法,以及各种常见表达式的应用场景,如匹配特定包下所有方法、特定前缀的方法等,是理解Spring AOP机制不可或缺的指南。

错误

@Before("execution(* com.LightseaBlue.Spring.*(..))")

分析

修改成下面这样,不过是多一个点的事,这就需要详细理解这里参数的含义
我们要找到Spring包下子包的类进行运行,而一个.代表了运行当前包下所有的方法
… 代表运行当前包和子包的方法

@Before("execution(* com.LightseaBlue.Spring..*(..))")

常见的切面表达式

1 所有公有方法的执行

execution(public * *(..))

2 所有以set开头的公有方法的执行

execution(* set*(..))

3 AccountService接口下的所有方法的执行

execution(* com.LightseaBlue.service.AccountService.*(..))

4 com.LightseaBlue.service包下的所有方法的执行

execution(* com.LightseaBlue.service.*.*(..))

5 com.LightseaBlue.service包及其子包下的所有方法的执行

execution(* com.LightseaBlue.service..*.*(..))

6 匹配com.LightseaBlue.service包下的所有类的所有方法(不含子包)

within(com.LightseaBlue.service.*)

7 com.LightseaBlue.service包和子包的所有方法

within(com.LightseaBlue.service..*)

8 匹配AccountService的代理类(不支持通配符)

this(com.LightseaBlue.service.AccountService)
### 关于 `java.lang.IllegalArgumentException` 错误分析 在 Java 开发中,当遇到类似于 `java.lang.IllegalArgumentException: warning no match for this type name: org.springframework.cloud.netflix.feign.Targeter` 的错误时,通常表明程序尝试解析某个类名或类型名称失败。这种问题可能由以下几个方面引起: #### 1. **反射机制中的参数命名缺失** 如果代码依赖 Spring 或其他框架的 AOP 功能,在某些情况下可能会因为缺少编译期调试信息而导致无法匹配目标类型的名称。例如,Spring 使用 CGLIB 或 JDK 动态代理来增强方法行为,而这些功能需要访问方法签名及其参数名称。如果没有启用 `-parameters` 编译选项,则可能导致此问题。 解决方案之一是在构建项目时显式开启支持保留方法参数名称的功能: ```bash javac -parameters YourSourceFile.java ``` 或者在 Maven 构建工具中添加以下配置[^1]: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <source>1.8</source> <target>1.8</target> <compilerArgs> <arg>-parameters</arg> </compilerArgs> </configuration> </plugin> </plugins> </build> ``` #### 2. **AOP 切面表达式的语法错误** 另一个常见原因是切点表达式 (Pointcut Expression) 中指定的目标包路径或类名存在拼写错误。例如,引用[3] 提到的情况可能是由于 Pointcut 定义不准确引起的。确保所有的通配符 (`*`) 和具体类名都正确无误非常重要。 对于 Feign Client 的场景下,可以调整 AspectJ 配置以更精确地定位服务接口实现类的位置。比如修改为如下形式[^3]: ```java @Pointcut("within(org.springframework.cloud.netflix.feign.*) && execution(* *(..))") public void feignClientMethods(){} ``` #### 3. **MyBatis 类型映射冲突** 虽然当前问题是针对 Feign Targeter 报错,但如果涉及到 MyBatis 数据持久层操作也可能引发类似的 IllegalArgumentException 异常。正如引用[5] 所述,检查 JDBC Type 映射是否一致非常必要。确认所有自定义枚举值均按照标准书写方式声明,并且大小写敏感度得到妥善处理。 修正后的例子应像这样[^5]: ```xml <resultMap id="BaseResultMap" type="com.example.model.User"> <!-- 正确的大写字母 --> <result column="age" jdbcType="INTEGER" property="age"/> </resultMap> ``` #### 示例修复代码片段 假设我们正在排查一个基于 Spring Cloud OpenFeign 的微服务应用,以下是改进版的服务客户端定义以及对应的 Bean 注册逻辑: ```java // Service Interface Definition with Proper Annotations @FeignClient(name = "example-service", url = "${feign.client.url}") public interface ExampleService { @GetMapping("/data/{id}") ResponseEntity<String> fetchData(@PathVariable Integer id); } // Configuration Class Ensuring Correct Initialization @Configuration @EnableFeignClients(basePackages = {"org.springframework.cloud.netflix.feign"}) public class FeignConfig { @Bean Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; } } ``` ### 总结建议 为了彻底消除此类运行时异常,请遵循以上提到的最佳实践并逐一验证各环节是否存在潜在隐患。特别注意的是,保持开发环境一致性(如统一 JVM 版本)、合理利用日志记录手段追踪上下文线索也是解决问题的关键所在。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值