tomcat 下软连接 freemark 模板文件不能访问
?请注意templateLoaderPath。而在FreeMarkerConfigurer的父类FreeMarkerConfigurationFactory 的createConfiguration 方法中有这样一段? ? ? ??
??查看freemarker的 FileTemplateLoader原来做了检查,就是下面的红色部分??解决方法:1.修改源码------哈哈2.忽然发现有一个构造方法是允许软连接的public?FileTemplateLoader(final?File?baseDir,?final?boolean?allowLinking) 所以想到用spring注入一个allowLinking =true的FileTemplateLoader。当我看到上面getTemplateLoaderForPath这个方法中的new?FileTemplateLoader(file);这句话时.我尿了。这尼玛真是个坑13.不过springmvc提供了一个preferFileSystemAccess 意思是你是否喜欢FileTemplateLoader。不喜欢的用我的SpringTemplateLoader 吧。经测试这条路走不通,spring 也判断了真实路径。3.看源码时看到支持templateLoaderPaths 注意多了一个s。多个路径。好吧。大家应该知道怎么办。4.自定义Temploader你可以在配置FreeMarkerConfigurer时添加一个自己的preTemplateLoaders 或者postTemplateLoaders 。这个很明显是前后。为什么提供前后。因为还有中间。哈哈。中间是谁。就是根据templateLoaderPath获取的。哈哈。好吧真213.如果有多个到底用哪个呢 ?看看?createConfiguration这个方法中有这么一句public Object findTemplateSource(String name) throws IOException{ // Use soft affinity - give the loader that last found this // resource a chance to find it again first. TemplateLoader lastLoader = (TemplateLoader)lastLoaderForName.get(name); if(lastLoader != null){ Object source = lastLoader.findTemplateSource(name); if(source != null){ return new MultiSource(source, lastLoader); } } // If there is no affine loader, or it could not find the resource // again, try all loaders in order of appearance. If any manages // to find the resource, then associate it as the new affine loader // for this resource. for(int i = 0; i < loaders.length; ++i){ TemplateLoader loader = loaders[i]; Object source = loader.findTemplateSource(name); if(source != null){ lastLoaderForName.put(name, loader); return new MultiSource(source, loader); } } lastLoaderForName.remove(name); // Resource not found return null; }??太明显不解释 当然你也可以不要中简单templateloader就是不定义templateLoaderPath属性。然后定义一个自己的templateloader注入到preTemplateLoaders 或者postTemplateL?
5.好吧你可以更狠一点把FreeMarkerConfigurer也替换掉哈哈