@ 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.



Как мне это исправить?. нужна помощь?

467   1  

1 ответ:

Это известная проблема с DynamicFeature . Инъекции не работают при регистрации в качестве объекта.

Одна вещь, которую вы можете сделать, это вручную ввести его, как упоминалось вэтом посте .

Еще одна вещь, которую вы можете сделать, - это сделать HerculesRestAccessor и applicationName инъекционными. Или, скорее, сделав имя приложения вводимым, вы можете сделать его свойством конфигурации иввести конфигурацию . Если вы сделаете это, то вы можете зарегистрировать фильтр как класс, и все инъекции должны работать.

Comments

    Ничего не найдено.