【发布时间】:2018-11-28 14:37:29
【问题描述】:
所以我正在尝试将自定义参数解析器添加到我的 Spring-Data-Rest 项目中。 我正在开发一个多租户应用程序,并且需要根据用户租户 ID 过滤数据。 所以我写了一个简单的注释和 ArgumentResolver 来查询我的租户存储库并在一些需要的方法上注入一个租户对象作为参数:
处理程序:
@AllArgsConstructor
public class TenantInjector implements HandlerMethodArgumentResolver {
private final TenantStore tenantStore;
private final TenantRepository tenantRepository;
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
if(! methodParameter.hasParameterAnnotation(InjectTenant.class)) {
return false;
}
return true;
}
@Override
public Object resolveArgument(MethodParameter methodParameter,
ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest,
WebDataBinderFactory webDataBinderFactory) throws Exception {
return tenantRepository.findById(tenantStore.getId()).get();
}
}
此处理程序查询tenantRepository 以通过其ID 查找当前租户,该ID 在解析传入请求的安全令牌时设置。
要注册处理程序,我执行以下操作:
@Configuration
public class DispatcherContext implements WebMvcConfigurer {
private final TenantStore tenantStore;
private final TenantRepository tenantRepository;
@Autowired
public DispatcherContext(TenantStore tenantStore, TenantRepository tenantRepository) {
this.tenantStore = tenantStore;
this.tenantRepository= tenantRepository;
}
@Override
public void addArgumentResolvers(
List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new TenantInjector(tenantStore, tenantRepository));
}
}
只要相应的 Controller 使用 @Controller 或 @RestController 注释,这就很好用
由于@RepositoryRestController 有其他上下文,因此忽略此配置。如何将相同的 ArgumentResolver 添加到 Spring-Data-Rest 配置?
切换注释可能是一种选择,但我宁愿坚持使用这种方法,因为链接是由 spring-data-rest 生成的。
有没有人因此而绊倒?
【问题讨论】: