Я в настоящее время реорганизую веб-приложение в Джерси и хочу связать некоторые проблемы с перекрестными проблемами в своих классах и использовать аннотации для методов перехвата. Например, существует множество методов, когда мне нужно проверить, является ли пользователь владельцем объекта, который он хочет изменить (в моем случае это проект). Поэтому внутри перехватчика мне нужно сделать вызовы в базе данных, и, хотя соответствующие DAO, которые были введены, были бы лучшим способом.@Inject не работает в MethodInterceptor под управлением HK2
В настоящее время мой перехватчик выглядит следующим образом:
public class ProjectOwnerCheckInterceptor implements MethodInterceptor {
@Inject
private EntityManager em;
@Inject
private UserProvider userProvider;
@Inject
private RMUserDAO rmUserDAO;
@Inject
private ProjectDAO projectDAO;
public ProjectOwnerCheckInterceptor() {
// TODO Auto-generated constructor stub
}
@Override
public Object invoke(MethodInvocation arg0) throws Throwable {
// First of all let's get the annotation
ProjectOwnerCheck check = arg0.getMethod().getAnnotation(ProjectOwnerCheck.class);
// if there is no check, then just proceed!
if (check == null)
arg0.proceed();
long projectId = (long) arg0.getArguments() [check.projectIdIndex()];
// Handling ownership!!
Project project = getProjectOrThrow(projectId);
return arg0.proceed();
}
}
Обычай аннотация прямо вперед. Мне нужно добавить какую-нибудь информацию, какой аргумент позиция EntityId в методе должен проверить это как количество параметров и типов различны:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface ProjectOwnerCheck {
int projectIdIndex() default -1;
}
Для Джерси/HK2, чтобы знать, что делать с перехватчиками я создал фильтр реализация InterceptionService:
public class HK2InterceptorFilter implements InterceptionService {
private final static MethodInterceptor PROJECT_CHECK_METHOD_INTERCEPTOR = new ProjectOwnerCheckInterceptor();
private final static List<MethodInterceptor> PROJECT_CHECK_METHOD_LIST = Collections
.singletonList(PROJECT_CHECK_METHOD_INTERCEPTOR);
public HK2InterceptorFilter() {
// TODO Auto-generated constructor stub
}
@Override
public Filter getDescriptorFilter() {
return BuilderHelper.allFilter();
}
@Override
public List<MethodInterceptor> getMethodInterceptors(Method method) {
if (method.isAnnotationPresent(ProjectOwnerCheck.class))
return PROJECT_CHECK_METHOD_LIST;
return null;
}
@Override
public List<ConstructorInterceptor> getConstructorInterceptors(Constructor<?> constructor) {
// TODO Auto-generated method stub
return null;
}
}
Я связывание этого фильтра в моем JerseyApplication классе:
register(new AbstractBinder() {
@Override
protected void configure() {
try {
bind(HK2InterceptorFilter.class).to(InterceptionService.class).in(Singleton.class);
bind(getPasswordStorage()).to(PasswordStorage.class);
bind(getDocumentService()).to(DocumentService.class);
bind(UserManagementAccessor.getUserProvider()).to(UserProvider.class);
} catch (Exception e) {
throw new InternalServerErrorException(e);
}
}
});
Когда установить контрольную точку в моем перехватчике Я вижу, что он правильно создан и называется методом gots. Но я полностью пропустил все те поля @Inject, которые мне нужно сделать, чтобы сделать чек. Я что-то упустил или это невозможно в HK2. Раньше я работал с Guice, и там он работает (я - из-за того, что база кода приложения довольно большая, но ограничена по времени - привязана к HK2 :)).
Спасибо за вашу помощь заранее!
PS:
Я использую Джерси 2,17
Это решило это! БЛАГОДАРЯ!! – Inkvine