Файлы свойств вызова службы отдыха 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 для загрузки файла конфигурации и его чтения.

Другие вопросы по тегам