2013-06-02 57 views
0

我想在我的应用程序中更新hibernate 3到4和spring 3到3.1以及spring security 3到3.1,但是当我这样做时,使用数据库内以前版本生成的权限的用户不可用和例外休眠和弹簧安全失败的更新

java.io.InvalidClassException GrantedAuthorityImpl local class incompatible 

当应用程序想从数据库中获取用户权限时发生。这是实体的用户的配置:

@ElementCollection(targetClass = GrantedAuthority.class, fetch=FetchType.EAGER) 
@CollectionTable(name = "user_authorities", schema = "mydb", joinColumns = @javax.persistence.JoinColumn(name = "user_id")) 
private Collection<GrantedAuthority> authorities; 
+0

当我将弹簧安全性从3.1降级到3时,一切正常,您是否知道针对此问题的任何解决方案? – nazila

+0

不,不存在多个Spring Security版本,我不试图破解一些类加载问题。 – nazila

回答

0

刚才检查master3.0.x分支之间的差异。你的问题是由Hibernate完成的序列化。根据JPA配置,您将可序列化的POJO(GrantedAuthorityImpl)对象直接存储到数据库中。这不是最佳方法。更好的办法是改变它来存储字符串的集合。


解决方法:你可以把旧GrantedAuthorityImpl源在你的来源,这样的类加载器会喜欢你的版本。那么你应该对Spring Security 3.1行不通,仍然使用你的方法。不过那是从黑客解决方案类。

+0

我如何检查数据库中是否存在用户权限的序列化! – nazila

+0

刚刚注意到JPA - Hibernate会为你序列化它。更新了我的答案。 –