【问题标题】:cglib compiler jdk compliancecglib 编译器 jdk 合规性
【发布时间】:2010-11-17 14:52:46
【问题描述】:

我在同事的邮箱中遇到了一个奇怪的错误。 CGLib 正在为 Spring AOP 日志记录自动代理服务类,并且在运行时它通过 cglib 代理类在 fastclass 上显示“未解决的编译错误:必须覆盖超类方法”。

在有问题的类中,我在实现接口时使用了@override 注释,并且我知道它在 jdk 1.6 中受支持,但在 1.5 中不受支持。 CGLib 正在自动代理该实现类。

但是,它在我的带有 jdk_1.6_17 的盒子上运行良好,但在他的带有 jdk_1.6_10 的盒子上却不行。

但是,他可以使用 maven 正确编译项目,maven 使用相同的 jdk。 移除 @Override 注解修复了运行时 cglib 错误,但这很奇怪吧?

cglib 使用什么编译器进行自动代理,这可能是 jdk_1.6_10 中的错误还是我还缺少其他东西?

使用 spring 3.0.4、jboss 5.10、spring security 3.0.3

基本上,该类在spring-security中实现了AuthenticationUserDetailsS​​ervice。

有问题的方法签名:

@Override
public UserDetails loadUserDetails(Authentication auth) throws UsernameNotFoundException;

UserDetails 是一个 spring-security 接口,Authentication 也是。

【问题讨论】:

  • 你能展示一些导致问题的方法的源代码吗?此方法是使用泛型还是声明为返回被覆盖方法返回类型(协方差)的子类型?
  • 添加了它,不是那样的,它实际上是返回 UserDetails 的自定义实现,但它被声明为返回 UserDetails。

标签: java spring jakarta-ee aop cglib


【解决方案1】:

好的,想通了。我已经明确地将 cglib 2.2 引入了 pom.xml,而 spring-flex 引入了 2.1_03,它是从 2005 年开始的。出于某种原因,我的盒子最终使用了新的,而我的同事最终使用了旧的。

有人知道为什么某个特定的会先加载吗?

【讨论】:

  • 它实际上是随机的(即一种算法,但不值得尝试使用它)。至少对于 cglib 来说,常见的解决方案似乎是将您自己的副本分叉到您自己的项目命名空间中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 2011-11-30
  • 2014-05-24
相关资源
最近更新 更多