没有找到类MemorySafeUndeclaredThrowableStrategy Spring Security

时间:2014-11-20 10:55:52

标签: spring-security

我目前有一个spring mvc应用程序,我试图添加spring security。但是,我无法使用@PreAuthorize注释而不会收到以下错误:

bean初始化失败;嵌套异常是java.lang.NoClassDefFoundError:org / springframework / cglib / transform / impl / MemorySafeUndeclaredThrowableStrategy

我目前正在使用Spring Version 4.1.0和Spring Security 3.2.5,根据spring的文档和其他帖子在这里应该可以正常工作。 在他们的github上也有一个样本,似乎没有问题使用相同的版本。

有什么想法吗?

PreAuthorize标记已添加到Controller中,cglib位于类路径中,但仍然是相同的错误消息。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

原来这是版本问题。 Spring Security目前是3.2.5.Release,我正在使用,但Spring是4.1.0。 从4.0.2开始,一些cglib类已被删除。解决方案是在Spring中降至4.0.1,或使用4.0.0.M2里程碑版本来实现Spring安全性。

答案 1 :(得分:0)

@PreAuthorize是通过AOP实现的。如果未在类实现的接口中声明放置注释的方法,则Spring不能使用默认的JDK代理,而是使用CGLIB代理类。

错误建议您使用类代理,但在类路径中没有CGLIB。

两种解决方法:

  • 将CGLIB添加到classpath
  • 让您的类实现一个接口
顺便说一下,你说你把@PreAuthorize添加到了RestController。 @PreAuthorize注释在服务层中更常见。通常,您对控制器中可能存在的内容使用基于URL的授权。解决问题的最佳方法是将@PreAuthorize注释移动到应该已作为接口连接的服务类。