1. 程式人生 > >SpringBoot velocity 模板配置絕對路徑的資源路徑

SpringBoot velocity 模板配置絕對路徑的資源路徑

velocity 配置模板路徑是class path 下面相對的。

如果我們再boot 生產環境下,對應模板路徑在class path 下那麼將一併打包到jar 中。這樣的情況我們就沒有辦法隨時修改模板檔案。這樣對於一個產品維護是相當不方便的。那麼就需要配置到一個jar 包的絕對路徑中。這樣我們可以隨時修改,並且可以隨時生效。

1.配置boot application.properties

spring.velocity.charset=UTF-8
spring.velocity.content-type=text/html
spring.velocity.properties.input
.encoding=UTF-8 spring.velocity.properties.output.encoding=UTF-8 spring.velocity.properties.file.resource.loader.class=com.yoke.common.FileResourceLoader spring.velocity.expose-request-attributes=true spring.velocity.expose-session-attributes=true spring.velocity.toolbox-config-location=toolbox.xml spring.velocity
.enabled=true spring.velocity.resource-loader-path=/boot/vm/ spring.velocity.suffix=.vm

其中
spring.velocity.properties.file.resource.loader.class 屬性是修改我們模板載入資源類(在這個類中我們需要進行自定義)

spring.velocity.resource-loader-path 是配置我們資源所在的絕對路徑

com.yoke.common.FileResourceLoader 類的程式碼如下:

package com.yoke.common;
/**
 * Created by jiangzeyin on 2017/1/5.
 */
import com.yoke.system.SystemBean; import com.yoke.system.log.SystemLog; import org.apache.commons.collections.ExtendedProperties; import org.apache.velocity.exception.ResourceNotFoundException; import org.apache.velocity.runtime.resource.Resource; import org.apache.velocity.runtime.resource.loader.ResourceLoader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; /** * @author jiangzeyin * @create 2017 01 05 18:30 */ public class FileResourceLoader extends ResourceLoader { Map<String, Long> fileLastModified = new HashMap<>(); @Override public void init(ExtendedProperties configuration) { } @Override public InputStream getResourceStream(String source) throws ResourceNotFoundException { File file = null; try { file = getResourceFile(source); return new FileInputStream(file); } catch (FileNotFoundException e) { SystemLog.LOG().info("FileNotFoundException:" + source + " " + file.getPath()); return this.getClass().getResourceAsStream(source); } finally { if (file != null) fileLastModified.put(source, file.lastModified()); } } @Override public boolean isSourceModified(Resource resource) { long lastModified = resource.getLastModified(); File file = getResourceFile(resource.getName()); return lastModified != file.lastModified(); } @Override public long getLastModified(Resource resource) { return fileLastModified.get(resource.getName()); } private File getResourceFile(String name) { return new File(String.format("%s/%s", SystemBean.getInstance().VelocityPath, name)); } }

這個類主要是去載入對應資源,velocity 預設是對資源有快取的,也就是載入一次資源後,第二次直接讀快取。這樣即使我們改了模板內容實際顯示還是沒有變更前的。這裡我們使用map 對模板資原始檔的最後一次修改時間進行一次快取。每一次讀取資源是先判斷最後一次修改時間是否變更。

其中60行 SystemBean.getInstance().VelocityPath 是對 application.properties 中的spring.velocity.resource-loader-path 屬性值進行讀取。