【问题标题】:Custom default headers for REST API only using Spring Data REST仅使用 Spring Data REST 的 REST API 的自定义默认标头
【发布时间】:2013-10-15 14:53:42
【问题描述】:

我有一个用例,我的应用程序托管 REST API 和 Web 应用程序,我们只需要向 REST API 添加自定义标头。 REST API 是通过 Spring Data REST 启用的。通常我们可以使用 Servlet 过滤器来实现这一点,但我们需要编写将请求隔离到 REST API 的逻辑并添加自定义标头。如果 Spring Data REST API 允许将默认标头添加到它生成的所有响应中,那就太好了。你都有些什么想法呢?别说我懒:)

【问题讨论】:

    标签: spring spring-data spring-data-rest


    【解决方案1】:

    对于寻找实际实施细节的人..

    拦截器

    public class CustomInterceptor extends HandlerInterceptorAdapter {
    
        @Override
        public boolean preHandle(HttpServletRequest request,
                HttpServletResponse response, Object handler) throws Exception {
            System.out.println("adding CORS headers.....");
            response.addHeader("HEADER-NAME", "HEADER-VALUE");
            return true;
        }
    
    }
    

    Java 配置

    @Configuration
    public class RepositoryConfig extends
            RepositoryRestMvcConfiguration {
    
        @Override
        public RequestMappingHandlerMapping repositoryExporterHandlerMapping() {
            RequestMappingHandlerMapping mapping = super
                    .repositoryExporterHandlerMapping();
    
            mapping.setInterceptors(new Object[] { new CustomInterceptor() });
            return mapping;
        }
    }
    

    【讨论】:

    【解决方案2】:

    由于 Spring Data REST 构建在 Spring MVC 之上,最简单的方法是配置自定义 HandlerInterceptor,如 reference documentation 中所述。

    使用 Spring Data REST 最简单的方法是扩展 RepositoryRestMvcConfiguration 并覆盖 repositoryExporterHandlerMapping,调用父方法,然后在其上调用 ….setInterceptors(…)

    【讨论】:

    • 是的,这对我也有用,但在新版本中,repositoryExporterHandlerMapping 方法已经消失,尝试以类似方式调整 restHandlerMapping 不起作用。使用addInterceptors 也不起作用。 @Oliver_Gierke,为 Spring Data REST 存储库定义拦截器的新方法是什么?
    • 对于那些将来搜索这个问题的人可以参考stackoverflow.com/a/32952220/4283455,这是一个更好的解决方案,我认为:)
    • 对于找到此答案的人来说,请注意:postHandle 的 ResponseEntity 方法存在一些问题(在添加标题之前提交了响应)。您应该改用 ControllerAdvice。详情在这里:mtyurt.net/2015/07/20/…
    【解决方案3】:

    最后,我设法使自定义拦截器的设置也适用于 spring-data-rest 2.4.1.RELEASE。

    @Configuration
    public class RestMvcConfig extends RepositoryRestMvcConfiguration {
    
        @Autowired UserInterceptor userInterceptor;
    
        @Autowired ApplicationContext applicationContext;
    
        @Override
        public DelegatingHandlerMapping restHandlerMapping() {
    
            RepositoryRestHandlerMapping repositoryMapping = new RepositoryRestHandlerMapping(resourceMappings(), config());
            repositoryMapping.setInterceptors(new Object[] { userInterceptor }); // FIXME: not nice way of defining interceptors
            repositoryMapping.setJpaHelper(jpaHelper());
            repositoryMapping.setApplicationContext(applicationContext);
            repositoryMapping.afterPropertiesSet();
    
            BasePathAwareHandlerMapping basePathMapping = new BasePathAwareHandlerMapping(config());
            basePathMapping.setApplicationContext(applicationContext);
            basePathMapping.afterPropertiesSet();
    
            List<HandlerMapping> mappings = new ArrayList<HandlerMapping>();
            mappings.add(basePathMapping);
            mappings.add(repositoryMapping);
    
            return new DelegatingHandlerMapping(mappings);  
        }
    
    }
    

    我必须重写 restHandlerMapping 方法,复制粘贴它的内容并添加一行 repositoryMapping.setInterceptors 以添加自定义拦截器,在我的例子中是 UserInterceptor

    有没有更好的办法?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 2018-05-13
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 2018-02-23
      • 2019-12-18
      相关资源
      最近更新 更多