из контекста Spring в аннотацию Spring - PullRequest
2 голосов
/ 13 февраля 2020

Я перевожу свой проектный пакет из конфигурации файла Spring xml в конфигурацию аннотации класса. Я застрял с ошибкой создания экземпляра компонента на компоненте, определенном в другом файле контекста xml. Это определение:

<bean id="mglsChecker" class="DefaultMglsAdapter" destroy-method="close">
        <constructor-arg value="${mgls.server.address}"/>
        <constructor-arg value="${mgls.fname}"/>
        <constructor-arg value="${mgls.lcount}"/>
    </bean> 

класс mglsChecker определяется в инфраструктурном пакете, общем для всего «решения». Проблема в том, что переменные "$ {}" не определены, поэтому теперь этот класс не создается. Я не понимаю, как это работает, когда мой проект xml файл настроен. В оригинальном applicationContext. xml я не вижу ссылок на этот контекстный файл mglsChecker. Любая помощь, где я должен посмотреть? что мне не хватает? спасибо,

Ответы [ 3 ]

1 голос
/ 13 февраля 2020

Вы можете использовать

@Configuration
class YourConfig {
    // you usually don't need to explicitly give the bean name
    // if you don't, Spring gives it the config's method name
    @Bean(name = "mglsChecker", destroyMethod = "close") 
    MglsAdapter mglsChecker(@Value("${mgls.server.address}") String address,
                                   @Value("${mgls.fname}") String  fname,
                                   @Value("${mgls.lcount}") long lcount) {
        return new DefaultMglsAdapter(address, fname, lcount);
    }
}

Лично я предпочитаю создавать @Component классы, но для этого вам нужно иметь возможность редактировать DefaultMglsAdapter класс.

@Component
class DefaultMglsAdapter implements MglsAdapter {
    // fields to hold the configs
    DefaultMglsAdapter(@Value("${mgls.server.address}") String address,
                                   @Value("${mgls.fname}") String  fname,
                                   @Value("${mgls.lcount}") long lcount) {
        // set fields
    }
    @PreDestroy
    void close() {
        // cleanup
    }
}

РЕДАКТИРОВАТЬ: включены исправление Андреаса:)

1 голос
/ 13 февраля 2020

Загрузить свойства в файл java с помощью

@Configuration
@PropertySource("classpath:foo.properties")
public class DefaultMglsAdapter{

    //...
}

Вставить свойства с помощью

@Value( "${mgls.server.address}" )
private String serverAddress;
0 голосов
/ 13 февраля 2020

Переменные, которые упоминаются с синтаксисом "$ {}", являются ключевыми / заполнителями свойств. Пожалуйста, найдите или найдите такой ключ в * .properties или * .config или *. xml или в любых таких пользовательских файлах свойств. Если вы обнаружите какой-либо такой файл свойств, укажите путь к классу или местоположение этого файла, в котором вы хотите его настроить, как указано ниже:

По XML:

<context:property-placeholder location="classpath:path/to/PropertiesFile"/>    

По аннотации:

@Configuration    
@PropertySource("classpath:path/to/PropertiesFile")    
@Value("${Property}")

Спасибо и всего наилучшего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...