我如何定义一个依赖于 /WEB-INF 文件夹中的配置文件的 Spring bean?我的一个 bean 有一个构造函数,它以配置文件的文件名作为参数。
问题是当我尝试实例化 Spring IoC 容器时 - 它失败了。当 Spring IoC 容器尝试创建以下 bean 时,我遇到了 FileNotFound 异常:
<bean id="someBean" class="Bean">
<constructor-arg type="java.lang.String" value="WEB-INF/config/config.json"/>
</bean>
这是我定义 ContextLoaderListener 的 web.xml 文件的一部分:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/beans.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
这种情况有什么解决办法吗?
// StackOverflow 不让我回答我的问题,所以我在这里发布一个解决方案:
解决方案是 - 您的 bean 类必须实现以下接口 - http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/context/ServletContextAware.html。Spring IoC 容器通知所有实现此接口的类 ServletContext 已被实例化。然后,您必须使用 ServletContext.getRealPath 方法来获取位于 WEB-INF 文件夹中某处的文件的路径。在我的例子中,bean 配置文件 beans.xml 保持不变。Bean类的最终版本如下图所示:
public class Bean implements ServletContextAware {
private Map<String, String> config;
private ServletContext ctx;
private String filename;
public Bean(String filename) {
this.filename = filename;
}
public Map<String, String> getConfig() throws IOException {
if (config == null) {
String realFileName = ctx.getRealPath(filename);
try (Reader jsonReader = new BufferedReader(new FileReader(realFileName))) {
Type collectionType = new TypeToken<Map<String, String>>(){}.getType();
config = new Gson().fromJson(jsonReader, collectionType);
}
}
return config;
}
@Override
public void setServletContext(ServletContext servletContext) {
this.ctx = servletContext;
}
}
我希望这可能对某人有所帮助,但如果您知道更好的解决方案 - 请分享。