一尘不染

java.lang.ClassCastException:无法将DTOObject强制转换为DTOObject

spring-boot

我在运行于Spring Boot
1.4.0M3的应用程序中遇到一个奇怪的问题,该应用程序使用Spring缓存实现,其中提供程序是Redis,我收到classCastException该对象无法转换

我正在使用Mongodb作为数据库,并且我的User对象包含了延迟加载的Roles对象列表,而Roles内部包含如下所示的Permissions对象

@Document
@Data
public class User implements Serializable{
private String passwordResetToken;

private boolean enabled = false;

@DBRef(lazy= true)
private List<Role> roleList;
}

我的角色DTO如下

@Data
@Document
public class Role implements Serializable{
   private String roleName;
    private String description;
    @DBRef(lazy= true)
    private List<Permission> permissions;
}

现在在我的SpringMVC中,在加载所有角色时,我正在调用所有权限,由于这是重复性操作,因此我想到了缓存结果并使用Redis,并在加载角色值时收到以下异常。

raised java.lang.ClassCastException: com.learning.securedapp.domain.Permission cannot be cast to com.learning.securedapp.domain.Permission

帮助我克服此错误。

我将源代码附加到我的项目,并且在RoleController.java的第91行收到错误

要在本地环境中复制,请登录到应用程序,然后依次单击权限菜单和角色菜单,现在在“角色”菜单中单击任何编辑图标。您将收到上述错误。


阅读 474

收藏
2020-05-30

共1个答案

一尘不染

当您将DevTools与缓存一起使用时,需要注意这一限制

当对象序列化到缓存中时,应用程序类加载器为C1。然后,在更改了某些代码/配置之后,devtools会自动重新启动上下文并创建一个新的类加载器(C2)。当您使用该缓存方法时,缓存抽象将在缓存中找到一个条目,然后从存储中反序列化该条目。如果缓存库未考虑上下文类加载器,则该对象将附加有错误的类加载器(这说明了奇怪的异常A cannot be cast to A)。

TL;DR如果缓存库不使用上下文类加载器,则不要使用devtools序列化类。或将您的缓存库放入应用程序类加载器中

restart.include.yourcache=/my-cache-lib-[\\w-]+\.jar
2020-05-30