仅使用Spring Data REST的REST API的自定义默认标头

时间:2013-10-08 15:22:34

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

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

3 个答案:

答案 0 :(得分:8)

对于那些寻找实际实施细节的人来说。

拦截

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;
    }
}

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

最后,我设法在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

还有更好的方法吗?