Как внедрить Spring Bean в ContainerRequestFilter с помощью AutoWired? - PullRequest
0 голосов
/ 03 июля 2018

Я использую RESTEasy 3 и Spring 4 и пытаюсь внедрить @Autowired служебный компонент в мой перехватчик, как показано ниже:

Но, запустив этот код, он возвращает Null Pointer Exception при доступе к моей службе доступа:

@Provider
@MyAnnotationToIntercept
public class MyInterceptor implements ContainerRequestFilter {


    private MyAccessService accessService;

    @Autowired
    public MyInterceptor(MyAccessService accessService) {
        this.accessService = accessService;
    }

    public MyInterceptor() {
    }

    @Override
    public void filter(ContainerRequestContext requestContext) {

        // DO SOME STUFF Using accessService
    }
}


@Component
public class MyAccessService {

    private MyDep1 dep1;

    @Autowired
    public MyAccessService(Mydep1 dep1) {
        this.dep1= dep1;
    }

}

Есть ли способ достичь этого? Это действительно возможно?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Похоже, вы разместили аннотацию @Autowired не в том месте. Оно должно быть выше объявления accessService. И в зависимости от того, как вы настроили контекст приложения, вам может не понадобиться метод установки для переменной экземпляра accessService.

0 голосов
/ 03 июля 2018

Вам нужно будет использовать метод WebApplicationContextUtils, чтобы получить бин внутри фильтра, который не управляется пружиной. Вот пример

MyAccessService myAccessService = (MyAccessService) WebApplicationContextUtils.getRequiredWebApplicationContext(httpServletRequest .getServletContext()).getBean(MyAccessService.class);

И для получения HttpServletRequest экземпляра вы можете использовать @context инъекцию

  @Context
  private HttpServletRequest httpServletRequest ;
...