[SPRING] 커스텀 어노테이션의 스프링 표현 언어
SPRING커스텀 어노테이션의 스프링 표현 언어
커스텀 어노테이션에서 Spring Expression Language를 사용하고 싶습니다. 이 주석은 사용자 정의 Aspect에서 사용됩니다.
이것 좀 봐:
@StatisticEventTrigger(value = TestStatisticEvent.class, expression = "#p1")
public void someOtherMethod(String arg1, Long arg2) {
보시다시피, 저는이 표현식을 사용하여 특정 인수를 검색하고 싶습니다.
주석이 달린 메서드를 트리거하는 Aspect가있는 경우 스프링 식을 (프로그래밍 방식으로) 평가하여 이후 비즈니스 요소에 사용할 값을 검색하고 싶습니다.
어떤 아이디어? Google은 지금까지 내 친구가 아니 었습니다!
해결법
-
==============================
1.나는 그것을 SpEL로 어떻게하는지 알아 냈다. 나는 다음 표현을 사용했다 :
나는 그것을 SpEL로 어떻게하는지 알아 냈다. 나는 다음 표현을 사용했다 :
@EventTrigger(value = EventTestModel.class, expression = "new Object[]{arguments[1], arguments[2]}")
및 Java 코드 다음 :
ExpressionParser parser = new SpelExpressionParser(); StandardEvaluationContext context = new StandardEvaluationContext(expressionEvaluationTarget); Object[] eventPayloadModels = parser.parseExpression(expression).getValue(context);
잘 작동;)
최신 정보
다음은 완전한 코드 예제입니다.
import com.example.AbstractEvent; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.apache.log4j.Logger; import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; import org.springframework.util.StringUtils; public class AnnotationEventTriggerAspect implements MethodInterceptor { private static final Logger LOG = Logger.getLogger(AnnotationEventTriggerAspect.class); private IEventHandler eventHandler; @Override public Object invoke(MethodInvocation invocation) throws Throwable { if (LOG.isDebugEnabled()) { LOG.debug("Invoking event event trigger for method: " + invocation.getMethod().getDeclaringClass() + "." + invocation.getMethod().getName()); } EventTrigger annotation = invocation.getMethod().getAnnotation(EventTrigger.class); Class<? extends AbstractEvent> eventClass = annotation.value(); if (eventClass == null) { throw new IllegalArgumentException("No event class provided for event event trigger annotation at method " + invocation.getMethod().getDeclaringClass() + "." + invocation.getMethod()); } AbstractEvent event = eventClass.newInstance(); String expression = annotation.expression(); Object result = invocation.proceed(); Object expressionEvaluationTarget = invocation; Object eventPayloadModels = invocation.getArguments(); if (annotation.useResult()) { expressionEvaluationTarget = result; eventPayloadModels = new Object[]{result}; } if (StringUtils.hasText(expression)) { ExpressionParser parser = new SpelExpressionParser(); StandardEvaluationContext context = new StandardEvaluationContext(expressionEvaluationTarget); eventPayloadModels = parser.parseExpression(expression).getValue(context); } if (eventPayloadModels != null) { if (eventPayloadModels.getClass().isArray()) { for (Object arg : (Object[]) eventPayloadModels) { event.addPayloadModel(arg); } } else { event.addPayloadModel(eventPayloadModels); } } eventHandler.post(event); return result; } public IEventHandler getEventHandler() { return eventHandler; } public void setEventHandler(IEventHandler eventHandler) { this.eventHandler = eventHandler; }
}
from https://stackoverflow.com/questions/20350961/spring-expression-language-in-custom-annotation by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Bcrypt로 InMemoryAuthentication 비밀번호 암호화 (0) | 2019.04.07 |
---|---|
[SPRING] Spring MVC에서 Spring의 DomainClassConverter를 사용하는 경우의 문제점 (0) | 2019.04.07 |
[SPRING] Spring 데이터 PageImpl이 올바른 크기의 페이지를 반환하지 않습니까? (0) | 2019.04.07 |
[SPRING] Spring 클래스 EnvironmentCapable (0) | 2019.04.07 |
[SPRING] 봄에 빈 구성 무시 (0) | 2019.04.07 |