Файлы свойств вызова службы отдыха jax-rs
контекст
Я следовал этому SO-ответу, чтобы создать и загрузить файл свойств.
Мой бэкэнд-код разделен на 4 проекта (Сервисы, Бизнес,DAO, Модели)
Сервисы
@Path("/users")
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<User> getUsers() {
return UserBusiness.getUsers();
}
Бизнес
public List<User> getUsers(){
return _userDao.findAll();
}
DAO
public List<User> getUsers(){
try{
String query = "";
PreparedStatement ps = null;
//Query to DB here
}catch(SQLException e){
}
}
модели
public class User{
private int id;
private String username;
private String password;
private String fullName;
}
Мой файл свойств хранится в Services
проект под пакетом com.resources
и класс ApplicationConfig
внутри этого проекта в пакете com.service
содержит это
public static final String PROPERTIES_FILE = "config.properties";
public static Properties properties = new Properties();
private Properties readProperties() {
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(PROPERTIES_FILE);
if (inputStream != null) {
try {
properties.load(inputStream);
} catch (IOException e) {
logger.severe(e.getMessage());
}
}
return properties;
}
Эта проблема
мой Services
проект содержит проект Models
как зависимость.
Мне нужно получить значение свойства внутри моего DAO
проект (возможно, в других проектах тоже позже). Я не могу добавить проект Services
к моему DAO
проект, потому что это добавит циклическую зависимость. Таким образом, я не могу достичь ApplicationConfig.properties.getProperty("myprop")
,
Как я могу использовать файл свойств? Должен ли я позволить readProperties()
внутри ApplicationConfig
? В какие проекты я должен поместить файл свойств?
2 ответа
Я сделал это с помощью Singleton внутри моего DAO
проект. У меня было 1 config.properties
за проект со следующим классом
public class PropertyHandler {
private final Logger logger = Logger.getLogger(PropertyHandler.class.getName());
private static PropertyHandler instance = null;
private Properties props = null;
private PropertyHandler() {
try {
props = new Properties();
InputStream in = PropertyHandler.class.getResourceAsStream("config.properties");
props.load(in);
in.close();
} catch (Exception e) {
logger.log(Level.SEVERE, "Error when loading DAO properties file\n***\n{0}", e.getMessage());
}
}
public static synchronized PropertyHandler getInstance() {
if (instance == null) {
instance = new PropertyHandler();
}
return instance;
}
public String getValue(String propKey) {
return this.props.getProperty(propKey);
}
}
В идеале ваш DAO-проект не должен зависеть от конфигурации того же файла, что и ваш Service-проект. У вас есть 2 варианта:
Загрузите все свои конфигурации один раз в вашем сервисном проекте в класс и все вокруг. В этом случае вы получите один большой конфигурационный файл с конфигурациями из ВСЕХ проектов.
повторно использовать код загрузчика файла конфигурации в статическом методе в классе util в отдельном проекте. Каждый проект теперь может иметь свои собственные файлы конфигурации и зависеть от проекта util для загрузки файла конфигурации и его чтения.