因此,我试图向我的项目中添加一个自定义参数解析器。我正在开发一个多租户应用程序,并且需要基于用户租户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();
}
}
此处理程序通过Id查询tenantRepository以查找当前租户,该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或@RestController注解,这就很好了。
由于@RepositoryRestController有其他上下文,因此将忽略此配置。如何将相同的ArgumentResolver添加到Spring配置中?
切换注释可能是一种选择,但我更愿意坚持这种方式,因为链接是由spring-data-rest生成的。
有人在这件事上绊倒了吗?
发布于 2018-12-06 12:40:28
您的问题可能是您在WebMvcConfigurer
中注册了自定义参数解析器。Spring数据Rest似乎在不同的上下文中工作,因此您必须在RepositoryRestMvcConfiguration
中注册自定义参数解析器。
@Configuration
public class RepositoryConfiguration extends RepositoryRestMvcConfiguration {
public RepositoryConfiguration(ApplicationContext context, ObjectFactory<ConversionService> conversionService)
{
super(context, conversionService);
}
@Override
protected List<HandlerMethodArgumentResolver> defaultMethodArgumentResolvers()
{
List<HandlerMethodArgumentResolver> resolvers =
new ArrayList<>(super.defaultMethodArgumentResolvers());
resolvers.add(new TenantInjector(tenantStore, tenantRepository));
return resolvers;
}
}
受启发的答案:https://github.com/tkaczmarzyk/specification-arg-resolver/issues/6#issuecomment-111952898
https://stackoverflow.com/questions/53521891
复制相似问题