enjoy 在Spring Boot devtools 下重新编译报错

<dependency>
	<groupId>com.jfinal</groupId>
	<artifactId>enjoy</artifactId>
	<version>3.2</version>
</dependency>

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-tomcat</artifactId>
	<scope>provided</scope>
</dependency>
		
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-devtools</artifactId>
	<scope>runtime</scope>
</dependency>

pom.xml是这样配的

jfinalViewResolver的配置和文档里的一样,开始启动,正常,页面正常,模版也可用

因为用到了devtools,所以在修改java文件后重新启动,这时报错,内容如下:

Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: Template function already exists : layout

评论区

JFinal

2017-09-28 22:56

这个是 spring Boot 的 devtools 的在热加载时,并没有切换掉 ClassLoader,从而造成热加载前的 Engine 对象中的配置还有那里,热加载以后再次添加,自然会报一个 template function already exists

建议的解决办法:
1:自己建一个 static boolean isEngineInited = false; 变量
2:在系统启动后,让这个变量变为 true
3:变为 true 以后,就不再对 enigne 进行配置

具体操作时,可以是创建一个 configEngine() 方法来对 engine 进行配置,在这个方法中添加对 isEngineInited 变量的控制即可

JFinal

2017-09-28 22:57

这个问题在 jfinal 中不会出现,因为 jfinal 的热加载很好的处理过 class loader 的问题,而按理说 spring boot 的 devtools 应该也会处理好这个问题,否则其它很多非 jfinal 的模块照样会碰到类似的某一处代码被多次执行的问题

热门反馈

扫码入社