[SPRING] Condition / ConfigurationCondition 인터페이스를 구현하는 클래스에서 @Value 또는 Environment를 작동시키는 방법
SPRINGCondition / 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.너는있어.
너는있어.
@Conditional(LocalHostStatusCondition.class)
Spring은 당신이 지정한 Class 형을 받아서 그것을 매치 메소드를 사용하도록 인스턴스화한다. 인스턴스를 Bean으로 간주하지 않으며, 자동 와이어 링을 수행하지 않으며 @Value 처리도 수행하지 않습니다. 후자는 BeanFactoryPostProcessor에서도 마찬가지입니다.
원하는 경우 ConditionContext에서 환경을 검색 할 수 있습니다. 다른 방법은 직접 속성을로드하는 것입니다.
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
'SPRING' 카테고리의 다른 글
[SPRING] Io 예외 : Oracle Cloud에서 Oracle 오류 ORA-12650 (0) | 2019.05.21 |
---|---|
[SPRING] 별도의 jar에있는 스프링 MVC 정적 리소스 (0) | 2019.05.21 |
[SPRING] Validator를 사용한 스프링 유닛 테스트 문제 (0) | 2019.05.21 |
[SPRING] spring / hibernate : 매번 세션 열기 / 닫기 VS getCurrentSession (0) | 2019.05.21 |
[SPRING] 주석으로 주석 된 메소드의 aspect는 다른 주석으로 주석 처리됩니다. (0) | 2019.05.21 |