복붙노트

[SPRING] Condition / ConfigurationCondition 인터페이스를 구현하는 클래스에서 @Value 또는 Environment를 작동시키는 방법

SPRING

Condition / ConfigurationCondition 인터페이스를 구현하는 클래스에서 @Value 또는 Environment를 작동시키는 방법

JavaConfig 만 사용하고 있습니다.

나는 다음과 같은 선언문을 가지고있다 :

@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}

다음과 같은 게시물에 따라 JavaConfig에는 필수 항목입니다. Spring 3.2 순수 Java 구성을 사용하는 @value 주석이 작동하지 않지만 Environment.getProperty가 작동 함

다음 코드는 완벽하게 작동합니다 (테스트 목적으로 @Values).

@Configuration
public class ActiveMQServerConfiguration {

    @Value("${localhost.address}")
    private String localHost;

    @Value("${remotehost.address}")
    private String remoteHost;

    @Value("${localhost.port}")
    private Integer localPort;

    @Value("${remotehost.port}")
    private Integer remotePort;

    @Bean(name="connectionFactory")
    @Conditional(LocalHostStatusCondition.class)
    public ActiveMQConnectionFactory localConnectionFactory(
            @Value("${localhost.protocol}") String protocol,
            @Value("${localhost.address}") String host,
            @Value("${localhost.port}") String port ){

        System.out.println("protocol: "+protocol);
        System.out.println("host: "+host);
        System.out.println("port: "+port);

        System.out.println("localHost: "+localHost);
        System.out.println("localPort: "+localPort);
        System.out.println("remoteHost: "+remoteHost);
        System.out.println("remotePort: "+remotePort);

콘솔 / 터미널에서 볼 수 있습니다.

알파

protocol: tcp
host: 127.0.0.1
port: 61616
localHost: 127.0.0.1
localPort: 61616
remoteHost: 192.168.1.34
remotePort: 61616

그러나 다음은 예상대로 작동하지 않습니다.

public class LocalHostStatusCondition implements Condition {

    private static final Logger logger = LoggerFactory.getLogger(LocalHostStatusCondition.class);

    @Value("${localhost.address}")
    private String localHost;

    @Value("${remotehost.address}")
    private String remoteHost;

    @Value("${localhost.port}")
    private Integer localPort;

    @Value("${remotehost.port}")
    private Integer remotePort;

    @Autowired
    private Environment environment;

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        logger.info("LocalHostStatusCondition...");

        System.out.println("localHost: "+localHost);
        System.out.println("localPort: "+localPort);
        System.out.println("remoteHost: "+remoteHost);
        System.out.println("remotePort: "+remotePort);
        System.out.println("Env..." + environment.getProperty("localhost.address", String.class) );

실질적으로 동일하고 환경과도 협력합니다.

출력은 다음과 같습니다.

베타

localHost: null
localPort: null
remoteHost: null
remotePort: null
[WARNING] 
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
    at com.manuel.jordan.infrastructure.support.LocalHostStatusCondition.matches(LocalHostStatusCondition.java:42)

조건 API에 따르면 :

ConfigurationCondition 정보이 글을 읽었을 때 Spring @ConfigurationCondition과 @Condition을 사용할 때? 너무

나는 다음과 같이 편집했다.

public class LocalHostStatusCondition implements ConfigurationCondition {

…

    @Override
    public ConfigurationPhase getConfigurationPhase() {
        return ConfigurationPhase.PARSE_CONFIGURATION;
    }

내가 사용하는 경우 :

하지만 콘솔 / 터미널 문장에 대해 아무것도 작동하지 않습니다, 내 말은, System.out 인쇄되지 않습니다 (이 이상한 행동에 대해) 이해가 안 돼요.

어떻게 해결할 수 있을까요?

그리고 네, 다음을 읽었습니다 : Spring @Conditional 구성 주석의 평가를 지연시키는 방법은 무엇입니까? 해결책이없는 것 같습니다 ...

고맙습니다

해결법

  1. ==============================

    1.너는있어.

    너는있어.

    @Conditional(LocalHostStatusCondition.class)
    

    Spring은 당신이 지정한 Class 형을 받아서 그것을 매치 메소드를 사용하도록 인스턴스화한다. 인스턴스를 Bean으로 간주하지 않으며, 자동 와이어 링을 수행하지 않으며 @Value 처리도 수행하지 않습니다. 후자는 BeanFactoryPostProcessor에서도 마찬가지입니다.

    원하는 경우 ConditionContext에서 환경을 검색 할 수 있습니다. 다른 방법은 직접 속성을로드하는 것입니다.

  2. from https://stackoverflow.com/questions/25276463/how-get-working-value-or-environment-in-a-class-implementing-the-condition-conf by cc-by-sa and MIT license