Spring 4.2 이상에서는 @EventListener annotation을 "condition"표현식과 함께 사용할 수있다.Spring 4.2+ : @EventListener 조건 표현식 내에서 Spring 빈 인스턴스를 참조하는 방법
제 시나리오에서는 이벤트 객체의 id를 .properties 파일에 구성된 일반 표현식과 일치시켜야합니다.
그러나 루트 컨텍스트는 이벤트 객체 자체 인 것처럼 보이지만 조건의 정규 표현식에서 모든 bean의 속성이나 메소드를 참조하는 것은 불가능한 것처럼 보입니다.
지금까지 클래스 이름을 기반으로 이벤트 ID 패턴 속성을 설정하는 추상 클래스가 있습니다. 목표는 각 이벤트 리스너의 구현을 가능한 깨끗하고 단순하게 만드는 것입니다.
regExpEventHandler=^(901|909|998|1000)$
dummyEventHandler=^([1-9][0-9]{0,2}|1000)$
그리고, 나는 위의 추상 클래스 확장 샘플 이벤트 리스너가 :
@Service
public class RegExpEventHandler extends AbstractEventHandler {
@Log
private ILog logger;
@Override
@EventListener(condition = "#event.eventid matches @regExpEventHandler.getEventIdPattern()")
public void onEvent(Event event) {
logger.debug("RegExpEventHandler processing : {} with event pattern : {}", event, getEventIdPattern());
}
}
문제는 표현이다를
@Service
@PropertySource(value = "classpath:subscriberEventMapping.properties")
public abstract class AbstractEventHandler implements IEventHandler {
private String eventIdPattern;
@Autowired
Environment env;
@Autowired(required = true)
public void configureEventIdPattern() {
String simpleClassName = this.getClass().getSimpleName();
String resolvedEventIdPattern = env.getProperty(
simpleClassName.substring(0,1).toLowerCase() +
simpleClassName.substring(1, simpleClassName.length()));
this.eventIdPattern = resolvedEventIdPattern == null ? ".*" : resolvedEventIdPattern;
}
public String getEventIdPattern() {
return eventIdPattern;
}
}
특성 파일은 다음과 같습니다
"# event.eventid @regExpEventHandler "는 @EventListener에 의해 사용되는 컨텍스트에서 찾을 수 없습니다 regExpEventHandler.getEventIdPattern @ 일치()"빈이 때문에
은 작동하지 않습니다. "
여기에 기존 스프링 빈의 메소드 또는 속성에 액세스 할 수있는 방법이 있습니까? 이 시나리오에 대한 다른 더 나은 접근법은 무엇입니까?
은 내가 쉽게 같은 것을 사용하여 정적 상수 또는 메서드에 액세스 할 수 있습니다 알고
#event.eventid matches T(my.package.RegExpEventHandler.MY_CONSTANT)
그러나 @Value 표현을 사용하여 특성 파일에서 초기화 할 수 없습니다 문자열 상수 (최종 정적)을.
작업 할 수 NON-FINAL 정적 상수를 사용하지만 각 이벤트 리스너는 우리가 피하고자하는 @Value 표현을 사용하여 비 정적 변수에서 정적 상수를 초기화하는 보일러 플레이트를 추가해야 .
미리 감사드립니다.
왜'regExpEventHandler'가 bean이 될까요? 그것은 bean이 아닌 속성입니다 ... –
만약 내가 따라갈 지 모르겠지만 ... 제 이해는 Spring EL 표현식 안에서 콩을 @를 사용하여 참조 할 수 있다는 것입니다. 나는 또한 # event.eventid와 같은 좀 더 간단한 것을 시도했다. $ {regExpEventHandler}는 프라퍼티 파일에서 상응하는 값을 얻어야 만한다.하지만 표현식도 실패한다. –
네, 그렇긴하지만 당신은 bean으로 프라퍼티를 참조하려고한다. 일하러 갈거야. –