【问题标题】:Spring Boot HandlerInterceptor not firing when Jersey Configured?配置 Jersey 时 Spring Boot HandlerInterceptor 不触发?
【发布时间】:2017-07-21 10:39:30
【问题描述】:

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

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

但是,拦截器与泽西岛一起被解雇似乎存在问题。我可以很好地访问 API(即 curl -i -H "Accept: application/json" -X GET http://localhost:8080/api/products ),但拦截器不会触发。如果我在没有 Jersey 的情况下连接一个更基本的应用程序进行资源管理,它们会正常运行吗?

这是当前的应用程序设置:

@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");。一个接一个地尝试了以下,但没有任何乐趣。

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/");

任何帮助 - 非常感谢,否则我将求助于用臭代码破解资源控制器:(。

谢谢 - 皮肤

【问题讨论】:

  • 好吧,不...HandlerInterceptor 是 Spring MVC 的东西,而不是 Jersey 的东西。
  • @M.Deinum 感谢您的回复!好的。所以我不能用 Jersey Servlet 注册 HandlerInterceptors。任何关于干净替代方案的想法 - 过滤器?
  • @M.Deinum 感谢您的指导。我找到了stackoverflow.com/a/13816147/2240475,它提供了 Stefan 的替代方法。

标签: java spring rest spring-boot jersey


【解决方案1】:

正如 M.Deinum 所提到的,HandlerInterceptor 不适用于泽西岛,也不是一些“底层”拦截器。它仅适用于 Spring MVC。对于泽西岛,您可以使用ContainerRequestFilter。您可以在 ResourceConfig 中注册它。

另请参阅:

【讨论】:

    猜你喜欢
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 2017-01-10
    • 1970-01-01
    • 2021-11-20
    • 2016-06-14
    • 1970-01-01
    相关资源
    最近更新 更多