복붙노트

[SPRING] 커스텀 어노테이션의 스프링 표현 언어

SPRING

커스텀 어노테이션의 스프링 표현 언어

커스텀 어노테이션에서 Spring Expression Language를 사용하고 싶습니다. 이 주석은 사용자 정의 Aspect에서 사용됩니다.

이것 좀 봐:

@StatisticEventTrigger(value = TestStatisticEvent.class, expression = "#p1")
public void someOtherMethod(String arg1, Long arg2) {

보시다시피, 저는이 표현식을 사용하여 특정 인수를 검색하고 싶습니다.

주석이 달린 메서드를 트리거하는 Aspect가있는 경우 스프링 식을 (프로그래밍 방식으로) 평가하여 이후 비즈니스 요소에 사용할 값을 검색하고 싶습니다.

어떤 아이디어? Google은 지금까지 내 친구가 아니 었습니다!

해결법

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

    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;
    }
    

    }

  2. from https://stackoverflow.com/questions/20350961/spring-expression-language-in-custom-annotation by cc-by-sa and MIT license