2013-10-08 201 views
3

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

回答

4

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

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

+0

感谢@Oliver_Gierke作品 – Stackee007

+3

是的,这也适用于我,但是对于新版本,'repositoryExporterHandlerMapping'方法消失了,并且尝试以类似的方式调整'restHandlerMapping'不起作用。使用'addInterceptors'也不起作用。 @Oliver_Gierke,定义Spring Data REST存储库拦截器的新方法是什么? –

+1

对于那些未来搜索这个问题的人可以参考http://stackoverflow.com/a/32952220/4283455这是一个更好的解决方案,我认为:) –

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

对于那些未来搜索这个问题的人可以参考http://stackoverflow.com/ a/32952220/4283455这是一个更好的解决方案,我认为:) –

1

最后我设法让自定义拦截器对弹簧的数据也正在安装-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

有没有更好的方法?