0

我如何定义一个依赖于 /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;
    }
}

我希望这可能对某人有所帮助,但如果您知道更好的解决方案 - 请分享。

4

1 回答 1

0

尝试移动config.json到您的资源文件夹并确保此文件在您的类路径中。接下来,使用value="/config/config.json" (or value="config/config.json"我不记得是否有前导斜杠:])。

于 2013-07-15T04:19:43.403 回答