Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 属性文件中的Spring和Constants类_Java_Spring - Fatal编程技术网

Java 属性文件中的Spring和Constants类

Java 属性文件中的Spring和Constants类,java,spring,Java,Spring,我想创建带有公共静态最终字段的Constants类,这些字段是从属性文件中获取的。 问题是ClassLoader总是为null,我无法获取属性文件InputStream 我使用的是SpringJava配置,我知道@PropertySource和@Value Spring注释,但我认为旧式常量类在代码中更具可读性 @Autowired Constants constants;//in every class that needs constant //... constants.getArticl

我想创建带有公共静态最终字段的Constants类,这些字段是从属性文件中获取的。 问题是ClassLoader总是为null,我无法获取属性文件InputStream

我使用的是SpringJava配置,我知道@PropertySource和@Value Spring注释,但我认为旧式常量类在代码中更具可读性

@Autowired
Constants constants;//in every class that needs constant
//...
constants.getArticleLimit()
vs简单

Constants.ARTICLES_LIMIT //static var version
这是我的代码:

package org.simpletest.utils

import org.apache.log4j.Logger;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class Constants {

    private static final Logger LOG = Logger.getLogger(Constants.class);

    public static final int ARTICLES_LIMIT;

    public static final String PROPERTIES_LOCATION = "constants.properties";

    static {
        Properties p = new Properties();

        //default values
        int articlesLimit = 10;

        Class<?> clazz = Constants.class.getClass(); 

        ClassLoader cl = clazz.getClassLoader();

        //try to load from properties file
        try(final InputStream is = cl.getResourceAsStream(PROPERTIES_LOCATION)){

            p.load(is);

            articlesLimit= Integer.parseInt(p.getProperty("articleslimit"));

        } catch (IOException e) {
            LOG.debug(String.format("Unable to load {0} properties file. Getting constants by default values.",PROPERTIES_LOCATION),e);
        }

        ARTICLES_LIMIT = articlesLimit;
    }
}
package org.simpletest.utils
导入org.apache.log4j.Logger;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.util.Properties;
公共类常量{
私有静态最终记录器LOG=Logger.getLogger(Constants.class);
公共静态最终整数限制;
公共静态最终字符串属性\u LOCATION=“constants.PROPERTIES”;
静止的{
属性p=新属性();
//默认值
int=10;
Class clazz=Constants.Class.getClass();
ClassLoader cl=clazz.getClassLoader();
//尝试从属性文件加载
try(最终输入流为=cl.getResourceAsStream(属性\位置)){
p、 负载(is);
articlesLimit=Integer.parseInt(p.getProperty(“articlesLimit”);
}捕获(IOE异常){
LOG.debug(String.format(“无法加载{0}属性文件。按默认值获取常量。”,属性\位置),e);
}
条款限制=条款限制;
}
}

经过一点测试后,这就是问题所在:

System.out.println(Constants.class.getClass());
这将打印类加载器可能尚未加载的
java.lang.Class
。这是因为
SomeClass.class
的类是
java.lang.class

删除
getClass()
,类加载器将不会为空。不需要
clazz
变量。这就是您需要做的全部工作:

ClassLoader cl = Constants.class.getClassLoader();

为什么不使用@Environment来读取属性文件?如果在上下文中使用PropertyPlaceholder,则可以直接在Springbean中使用属性值。请参阅@MichaelPeacock,如果我正确理解,这将迫使我在使用它们的每个类中添加所有常量。似乎在静态块之后才设置类加载器?但是我不能复制这个。什么版本的JVM?谢谢,这很有帮助。