如何在 Spring 数据剩余中添加自定义拦截器 (spring-data-rest-webmvc 2.3.0)
How to add Custom Interceptor in Spring data rest (spring-data-rest-webmvc 2.3.0)
我正在处理 spring 数据休息服务并且在自定义拦截器中遇到了一些问题。早些时候我使用 spring-data-rest-webmvc 2.2.0 并按以下方式添加拦截器。
public RequestMappingHandlerMapping repositoryExporterHandlerMapping() {
RequestMappingHandlerMapping mapping = super
.repositoryExporterHandlerMapping();
mapping.setInterceptors(new Object[] { new MyInterceptor() });
return mapping;
}
它对我来说非常好。但是当我升级到 spring-data-rest-webmvc 2.3.0 版本时,我注意到 handlerMapping 隐藏在 DelegatingHandlerMapping 后面。因此我尝试通过以下方式添加拦截器。
在我的一个配置 class 中,我扩展了 RepositoryRestMvcConfiguration class 并覆盖了它的方法。
public class AppConfig extends RepositoryRestMvcConfiguration {
@Autowired ApplicationContext applicationContext;
@Override
public DelegatingHandlerMapping restHandlerMapping()
{
RepositoryRestHandlerMapping repositoryMapping = new RepositoryRestHandlerMapping(super.resourceMappings(), super.config());
repositoryMapping.setInterceptors(new Object[] { new MyInterceptor()});
repositoryMapping.setJpaHelper(super.jpaHelper());
repositoryMapping.setApplicationContext(applicationContext);
repositoryMapping.afterPropertiesSet();
BasePathAwareHandlerMapping basePathMapping = new BasePathAwareHandlerMapping(super.config());
basePathMapping.setApplicationContext(applicationContext);
basePathMapping.afterPropertiesSet();
List<HandlerMapping> mappings = new ArrayList<HandlerMapping>();
mappings.add(basePathMapping);
mappings.add(repositoryMapping);
return new DelegatingHandlerMapping(mappings);
}
}
但是在添加这个之后,我的一些存储库操作(对存储库的 findAll() 操作)开始失败。如果我删除了这个拦截器,那么这些操作就可以正常工作。 (在这个拦截器中,我只是对用户进行身份验证。)
因此我无法理解这里的问题。我是否以错误的方式添加了拦截器?还有其他方法可以添加拦截器吗?
你不应该使用 repositoryMapping.setInterceptors()
- 它会破坏放置在那里的内部拦截器 Spring,这可能是某些方法停止工作的原因。
我建议您覆盖 jpaHelper()
方法并将您的拦截器放入 RepositoryRestMvcConfiguration
中的 JpaHelper
对象中。 Spring 将它们添加到全局拦截器列表中。
但是,如果您只需要身份验证,为什么不使用 Spring 安全过滤器?
编辑:上述解决方案仅适用于 RepositoryRestHandlerMapping
,不适用于 BasePathAwareHandlerMapping
。
我建议您在某处声明一个自定义 MappedInterceptor
bean:
@Bean
public MappedInterceptor myMappedInterceptor() {
return new MappedInterceptor(new String[]{"/**"}, new MyInterceptor());
}
根据我对源代码的理解Spring应该会自动将这个拦截器添加到所有请求处理程序中。
我正在处理 spring 数据休息服务并且在自定义拦截器中遇到了一些问题。早些时候我使用 spring-data-rest-webmvc 2.2.0 并按以下方式添加拦截器。
public RequestMappingHandlerMapping repositoryExporterHandlerMapping() {
RequestMappingHandlerMapping mapping = super
.repositoryExporterHandlerMapping();
mapping.setInterceptors(new Object[] { new MyInterceptor() });
return mapping;
}
它对我来说非常好。但是当我升级到 spring-data-rest-webmvc 2.3.0 版本时,我注意到 handlerMapping 隐藏在 DelegatingHandlerMapping 后面。因此我尝试通过以下方式添加拦截器。
在我的一个配置 class 中,我扩展了 RepositoryRestMvcConfiguration class 并覆盖了它的方法。
public class AppConfig extends RepositoryRestMvcConfiguration {
@Autowired ApplicationContext applicationContext;
@Override
public DelegatingHandlerMapping restHandlerMapping()
{
RepositoryRestHandlerMapping repositoryMapping = new RepositoryRestHandlerMapping(super.resourceMappings(), super.config());
repositoryMapping.setInterceptors(new Object[] { new MyInterceptor()});
repositoryMapping.setJpaHelper(super.jpaHelper());
repositoryMapping.setApplicationContext(applicationContext);
repositoryMapping.afterPropertiesSet();
BasePathAwareHandlerMapping basePathMapping = new BasePathAwareHandlerMapping(super.config());
basePathMapping.setApplicationContext(applicationContext);
basePathMapping.afterPropertiesSet();
List<HandlerMapping> mappings = new ArrayList<HandlerMapping>();
mappings.add(basePathMapping);
mappings.add(repositoryMapping);
return new DelegatingHandlerMapping(mappings);
}
}
但是在添加这个之后,我的一些存储库操作(对存储库的 findAll() 操作)开始失败。如果我删除了这个拦截器,那么这些操作就可以正常工作。 (在这个拦截器中,我只是对用户进行身份验证。) 因此我无法理解这里的问题。我是否以错误的方式添加了拦截器?还有其他方法可以添加拦截器吗?
你不应该使用 repositoryMapping.setInterceptors()
- 它会破坏放置在那里的内部拦截器 Spring,这可能是某些方法停止工作的原因。
我建议您覆盖 jpaHelper()
方法并将您的拦截器放入 RepositoryRestMvcConfiguration
中的 JpaHelper
对象中。 Spring 将它们添加到全局拦截器列表中。
但是,如果您只需要身份验证,为什么不使用 Spring 安全过滤器?
编辑:上述解决方案仅适用于 RepositoryRestHandlerMapping
,不适用于 BasePathAwareHandlerMapping
。
我建议您在某处声明一个自定义 MappedInterceptor
bean:
@Bean
public MappedInterceptor myMappedInterceptor() {
return new MappedInterceptor(new String[]{"/**"}, new MyInterceptor());
}
根据我对源代码的理解Spring应该会自动将这个拦截器添加到所有请求处理程序中。