Подтвердить что ты не робот

Метод перехватчика, не вызываемый с перехватчиком перехватчика

Я использую Java EE 6 и Jboss AS7.1 и пытаюсь использовать привязку перехватчика (Пример с сайта jboss).

У меня есть аннотация InterceptorBinding:

@InterceptorBinding
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface GeoRestrictedEquipment {
}

Перехватчик:

@GeoRestrictedEquipment
@Interceptor
public class GeoRestrictedEquipmentInterceptor {

    @EJB EquipmentDao equipmenttDao;    
    @EJB SecurityService securityService;    

    @AroundInvoke
    public Object checker(InvocationContext ctx) throws Exception {
        Integer id = (Integer) ctx.getParameters()[0];
        Equipment equipment = equipmenttDao.findById(id);
        GeoChecker.check(equipment.getSite(), securityService.getUser());

        return ctx.proceed();
    }
}

И bean:

@Stateless
@LocalBean
@SecurityDomain(Realm.NAME)
@RolesAllowed({ Roles.REGISTERED })
public class PumpService implements PumpServiceLocal {

    @Override
    @GeoRestrictedEquipment
    public PumpInfos getPumpInfos(Integer pumpId) {
        /* ... */
    }
}

Но перехватчик не называется... Что я пропустил из примера?

Перехватчик вызывается, когда я пишу это:

@Override
@Interceptors({GeoRestrictedEquipmentInterceptor.class})
public PumpInfos getPumpInfos(Integer pumpId) {
    /* ... */
}

Спасибо за вашу помощь.

4b9b3361

Ответ 1

Вы включили свой перехватчик, как описано в примере, приведенном в ссылке?

По умолчанию в архиве bean нет разрешенных перехватчиков, связанных через перехватчиков. Перехватчик должен быть явно включен перечисляя его класс под элементом beans.xml файл архива bean.

Ответ 2

В соответствии с документацией существует другой способ, а не использование beans.xml:

Вам не нужно указывать перехватчик в файле beans.xml, когда вы используете аннотацию @Priority.

@Logged
@Interceptor
@Priority(Interceptor.Priority.APPLICATION)
public class LoggedInterceptor implements Serializable { ... }

И он работает.

Ответ 3

Вы можете использовать любое значение приоритета = Приоритет. По умолчанию используется 2000.

Например =

@Interceptor 
@Loggable 
@Priority(100)
public class FileLogger {}

Тип приоритета:

  • PLATFORM_BEFORE [0-999] - перехватчики начинаются с первого. Они запускаются платформой.
  • LIBRARY_BEFORE [1000-1999] - библиотеками.
  • ПРИМЕНЕНИЕ [2000-2999] - приложением
  • LIBRARY_AFTER, PLATFORM_AFTER [3000-4000]

Вы управляете первичной загрузкой для перехватчиков.