Как отключить перехватчик Java EE при запуске приложения, например, по условию из базы данных logger = info? - PullRequest
0 голосов
/ 04 января 2019

Я использую Java EE и сервер WebLogic. Я объявляю перехватчик с аннотированным стилем: @Interceptor. Мне нужно добавить некоторые функции, которые бы отключили определенный перехватчик. Я использую аннотацию, чтобы пометить методы, когда нужно вызвать Interceptor.


@Inherited
@InterceptorBinding
@Retention(RUNTIME)
@Target({METHOD, TYPE})
public @interface Traced {
}

 @Traced
    @Interceptor
    @Priority(Interceptor.Priority.APPLICATION)
    public class MethodInvocationInterceptor implements Serializable {

        private static final Logger LOG = Logger.getLogger(MethodInvocationInterceptor.class);

        @AroundInvoke
        public Object intercept(final InvocationContext ctx) throws Exception {
          LOG.trace(ctx.getMethod().getName() + " method started");
        return ctx.proceed();
      }

1 Ответ

0 голосов
/ 07 января 2019

Есть три разумных подхода, которые я могу придумать.

Во-первых, то же самое, что предлагал @Nikos, всегда оставляйте перехватчик включенным и просто добавьте условную логику, основанную на конфигурации.

Второй подход требует расширения CDI, где вы отслеживаете AfterTypeDiscovery событие . Это позволяет вам получить списки альтернатив, перехватчиков и декораторов. Эти списки являются изменяемыми, и как только вы их измените, контейнер должен принять во внимание значения изменений. Удаление перехватчика должно привести к отключению перехватчика.

Этот подход, опять же с расширением CDI, требует, чтобы вы отслеживали AnnotatedType перехватчика, используя ProcessAnnotatedType событие , и отключали его, используя метод veto(). В качестве альтернативы, если вето не сокращает его, вы можете изменить AnnotatedType и удалить / заменить привязку перехватчика (хотя такой подход звучит несколько «хакерски», поскольку вы заканчиваете перехватчиком без привязок).

...