Метод перехватчика, не вызываемый с перехватчиком перехватчика
Я использую 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) {
/* ... */
}
Спасибо за вашу помощь.
Ответы
Ответ 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]
Вы управляете первичной загрузкой для перехватчиков.