I want to create Constants class with public static final fields, which I get from Properties file. The issue is that ClassLoader always null, and i can't get properties file InputStream.
I'm using Spring Java Configuration and I know about @PropertySource and @Value spring annotations, but I think old-style Constants class more readable in code.
@Autowired
Constants constants;//in every class that needs constant
//...
constants.getArticleLimit()
vs simple
Constants.ARTICLES_LIMIT //static var version
Here's my code:
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;
}
}