Jersey配置时Spring Boot HandlerInterceptor没有触发?

时间:2017-07-21 10:39:30

标签: java spring rest spring-boot jersey

我有一个配置了Jersey的Spring Boot v1.4.0应用程序,用于提供RESTful服务。

我有一个有效的应用程序,但我现在正试图通过多租户SCHEMA意识策略来增强它。我希望使用Spring的HandlerInterceptor框架基于客户端身份验证头设置TenantContext ...

但是,拦截器似乎与泽西一起被解雇了。我可以很好地打击API,( curl -i -H"接受:application / json" -X GET http://localhost:8080/api/products ),但拦截器刚赢了&#39 ;火。如果我连接一个没有泽西岛的更基本的应用程序来进行资源管理,它们会很好吗?

以下是当前的应用程序设置:

@SpringBootApplication
@EnableAutoConfiguration
public class Application {
    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).run(args);
    }
}

注册拦截器

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Autowired
    HandlerInterceptor tenantInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(tenantInterceptor);
    }
}

拦截器本身

@Component
public class TenantInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {
        // FIXME: Put in a Logger impl
        System.out.println("++++++++++++=======+++++++++ TenantInterceptor.preHandle() Checking for Tenant Routing");

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        TenantContext.clear();
        // FIXME: Put in a Logger impl
        System.out.println("++++++++++++=======+++++++++ TenantInterceptor.postHandle() Reset Tenant to " + TenantContext.getCurrentTenant());
    }
}

JerseyConfig

@Component
@ApplicationPath("api")
public class JerseyConfig extends ResourceConfig {

    @PostConstruct
    private void init() {
        registerClasses(TenantsResource.class);
        registerClasses(UsersResource.class);
        registerClasses(ProductsResource.class);
    }

}

我使用了JerseyConfig @ApplicationPath(" api")和WebMvcConfig registry.addInterceptor(tenantInterceptor).addPathPatterns(" patterns&#34) ); 。接下来试了一下,但没有快乐。

registry.addInterceptor(tenantInterceptor).addPathPatterns("/*");

registry.addInterceptor(tenantInterceptor).addPathPatterns("/**");

registry.addInterceptor(tenantInterceptor).addPathPatterns("/api/**");

registry.addInterceptor(tenantInterceptor).addPathPatterns("/api/*");

registry.addInterceptor(tenantInterceptor).addPathPatterns("/api/products");

registry.addInterceptor(tenantInterceptor).addPathPatterns("/api/products/");

任何帮助 - 非常感谢,否则我会使用臭臭的代码来攻击资源控制器:(。

谢谢 - Derm

1 个答案:

答案 0 :(得分:1)

如M.Deinum所述,HandlerInterceptor不适用于泽西岛,也不是一些“颠倒”拦截器。它仅适用于Spring MVC。对于Jersey,您可以使用ContainerRequestFilter。您可以在ResourceConfig上注册它。

另见: