Spring Data Rest自定义参数解析器

时间:2018-11-28 14:37:30

标签: spring spring-data-rest

因此,我试图将自定义参数解析器添加到我的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或@RestController注释相应的Controller,此方法就很好用

由于@RepositoryRestController具有其他上下文,因此将忽略此配置。如何将相同的ArgumentResolver添加到Spring-Data-Rest配置中?

仅切换注释可能是一个选项,但是我想坚持这种方法,因为链接是由spring-data-rest生成的。

有人绊倒这个吗?

1 个答案:

答案 0 :(得分:0)

您的问题可能是您在WebMvcConfigurer中注册了自定义参数解析器。 Spring Data 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

启发