我正在使用spring缓存来缓存我的数据库结果,当弹簧缓存启用时,我们会收到奇怪的异常ClassCastException,因为已知的limitation是Spring开发工具。
现在我想从自动重启或重新加载中排除包含缓存的类,我们如何实现这一目标?
答案 0 :(得分:0)
您可以非常轻松地解决此问题。
首先,您可以完全禁用缓存,只需在配置中添加以下内容:
spring.cache.type=none
您可以将其添加为系统属性,或者添加到IDE的运行配置中,以便仅当您在盒子上使用devtools时才适用。
然后,您可以切换到不序列化对象内容的缓存管理器实现。实现这一目标的一种方法是在内存中使用特定的配置文件创建缓存管理器:
@Configuration
@Profile("dev")
public DevConfig {
public CacheManager cacheManager() {
return new SimpleCacheManager();
}
}
然后启用dev配置文件(再次通过属性或IDE的运行配置)。如果您有复杂的逐出规则,现在可能会有效。
最后,您可以通过在应用程序类加载器中添加(包括)缓存库(负责序列化的组件)来修复底层问题。有关详细信息,请参阅this link。
答案 1 :(得分:0)
Spring Boot提供的重启技术通过使用两个类加载器来工作。不变的类(例如,来自第三方jar的类)将被加载到基本类加载器中。您正在积极开发的类将加载到重新启动类加载器中。重新启动应用程序后,将丢弃重新启动类加载器,并创建一个新的类加载器。这种方法意味着应用程序的重启通常比“冷启动”要快得多,因为基本类加载器已经可用并已填充。
默认情况下,IDE中的任何打开的项目都使用“重新启动”类加载器加载,而任何常规的.jar文件都使用“基本”类加载器加载。如果您在多模块项目上工作,并且并非每个模块都导入到IDE中,则可能需要自定义内容。为此,您可以创建一个 META-INF / spring-devtools.properties 文件。
spring-devtools.properties文件可以包含带有restart.exclude和restart.include前缀的属性。 include元素是应上拉到“重新启动”类加载器中的项目,而exclude元素是应下推到“基本”类加载器中的项目。该属性的值是一个应用于类路径的正则表达式模式,如以下示例所示:
restart.exclude.companycommonlibs=/mycorp-common-[\\w\\d-\.]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w\\d-\.]+\.jar