问题描述
|
背景
我们有一个现有的web应用程序,它使用Struts 2和Freemarker构建,我通过复制一些代码和模板创建了一个变体。笨拙,但易于管理。但是,我们很快就会制作出许多其他变体(需要是单独的WAR),使复制变得站不住脚。我的想法是改为将所有共享的内容放到每个Webapp附带的jar中:通用文件可以保存在一个地方,甚至更好的是,给定的Webapp可以覆盖类路径中的文件。到目前为止,我已经可以使用代码执行此操作,但是Convention插件使Freemarker模板难以执行相同操作。
问题
到目前为止,我们的Web应用程序依靠Convention来为应用程序启动时的操作找到Freemarker的“操作结果”(即模板),从而使我们免于繁琐地注释每个操作。如果我已经正确地跟踪了事情,则类“ 0”负责查找操作结果;特别地,方法
createFromresources
在Web应用程序中查找,然后在类路径中查找与我们的操作匹配的模板文件。
这正是我想要的–除了我们将模板放在/WEB-INF
下以保护它们免受外部访问(在Struts配置中使用struts.convention.result.path
常量)。到目前为止,此方法可以正常工作,所有模板文件都位于/WEB-INF
下,但不适用于类路径上的文件。 “ 0”当然可以在类路径中找到文件,但是仅当webapp模板直接位于上下文根目录下时,因为任何类路径模板都必须位于与上下文根目录下的模板目录结构等效的包结构中。若要在“ struts.convention.result.path \”以“ / WEB-INF /”开头时找到操作结果,将需要一个名为“ web-inf”的根程序包–但是,程序包名称中当然不允许使用连字符。
(请注意,此问题与后来用于实际抓取模板文件的TemplateLoader
类无关。加载过程可以很容易地配置为在许多地方查看-但是,如果找不到“操作结果”,则应用程序就无法做到那么远在启动时。如果两个进程使用相同的配置,那就太好了……)
解决方案?
所以……我可以将所有模板移到ѭ2之外,但实际上我宁愿不这样做。或者,我可以为每个动作类提供特定的注释,但我还是不想(确实可能会遇到相同的问题)。
或者,我可以通过复制并稍微更改DefaultResultMapBuilder
来实现自己的ResultMapBuilder
实现(后者中的每个成员都是私有的,因此我不能扩展该类并仅更改相关部分– !!),然后弄清楚如何覆盖\“ struts-plugin.xml \” Struts配置文件(更改org.apache.struts2.convention.ResultMapBuilder
bean),因此在类路径上查找时,我可以使Convention忽略\ // WEB-INF \。也许更好,在ServletContext中查看时,始终在路径前加上\“ / WEB-INF / \”。
但是也许有一个更简单的方法?一些未记录的配置魔术?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)