@ Context injection не работает в Jersey ContainerRequestFilter (Dropwizard)
@Context injection работает с классами, но не может заставить его работать с объектами.
HttpServletRequest в ContainerRequestFilter создает нулевой указатель.
Версия Dropwizard: - 1.1.0
ContainerRequestFilter
public class ApplicationIPAuthFilter implements ContainerRequestFilter {
private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationIPAuthFilter.class);
private HerculesRestAccessor restAccessor;
private String applicationName;
@Context
private HttpServletRequest httpServletRequest;
public ApplicationIPAuthFilter(){
}
public ApplicationIPAuthFilter(HerculesRestAccessor accessor, String applicationName) {
restAccessor = accessor;
this.applicationName = applicationName;
}
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
// need remote Ip
String remoteIp = this.httpServletRequest.getRemoteAddr();
....
}
}
DynamicFeature
@Provider
public class ApplicationIPAuthFeature implements DynamicFeature {
private final HerculesRestAccessor accessor;
private final String applicationName;
public ApplicationIPAuthFeature(HerculesRestAccessor accessor, String applicationName) {
this.accessor = accessor;
this.applicationName = applicationName;
}
@Override
public void configure(ResourceInfo resourceInfo, FeatureContext context) {
if (resourceInfo.getResourceMethod().getAnnotation(ApplicationIPAuthRequired.class) != null) {
// not working
context.register(new ApplicationIPAuthFilter(accessor, applicationName));
//@Context injection works in ContainerRequestFilter for classes
//context.register(ApplicationIPAuthFilter.class);
}
}
}
Я пытаюсь получить удаленный ip в ContainerRequestFilter для проверки подлинности запроса на основе ip.
Как мне это исправить?. нужна помощь?
1 ответ:
Это известная проблема с DynamicFeature . Инъекции не работают при регистрации в качестве объекта.
Одна вещь, которую вы можете сделать, это вручную ввести его, как упоминалось вэтом посте .
Еще одна вещь, которую вы можете сделать, - это сделатьHerculesRestAccessor
иapplicationName
инъекционными. Или, скорее, сделав имя приложения вводимым, вы можете сделать его свойством конфигурации иввести конфигурацию . Если вы сделаете это, то вы можете зарегистрировать фильтр как класс, и все инъекции должны работать.
Comments