春季:如何从MappedInterceptor检测目标JPA存储库类

时间:2019-05-01 07:34:05

标签: java spring spring-data-jpa spring-data spring-data-rest

我正在按照post中的建议使用MappedInterceptor实现拦截器模式。

拦截器按预期工作,并且拦截@RestControllersSpring JPA Repositories ...

现在,使用preHandle方法签名(包括:HttpServletRequest request, HttpServletResponse response, Object handler => can be casted to org.springframework.web.method.HandlerMethod)中可用的参数,如何访问RestRepository类或正在调用的存储库方法(getMethod(),从HandlerMethod类适用于Concrete类,但不适用于Repository接口,最终返回一个RestAbstractController类,该类通过反射调用目标存储库)?

我为什么需要这个?

因为,我正在执行一个跨领域逻辑,该逻辑需要访问存储库接口以查找特定的业务注释,如果存在注释,则需要执行一些逻辑(例如,设置MDC特殊值,用于示例)...

谢谢...

1 个答案:

答案 0 :(得分:0)

如果您知道实际的域类,则可以尝试访问存储库,因为可以将.mybuttons的实例注入到您的类中。这样一来,您就可以查找实体和存储库信息以及存储库本身。

由于后者不必强制实现专用接口,因此Repositories仅返回Repositories.getRepositoryFor(…),如果您想在存储库中实际执行操作,这并没有太大帮助。 Optional<Object>允许您创建RepositoryInvokerFactory实例,这些实例使您可以独立于实际声明的方式显式地调用存储库上的某些方法。

RepositoryInvoker

请注意,如果您使用Spring Data REST,则@Component @RequiredArgsConstructor class SomeComponent { private final Repositories repositories; public <T> void someMethod(Class<T> type) { … = repositories.getEntityInformation(type); RepositoryInvokerFactory factory = new DefaultRepositoryInvokerFactory(repositories); RepositoryInvoker invoker = factory.getInvokerFor(type); Optional<T> entity = invoker.invokeFindById(4711); } } 实例可用作Spring Bean。如果您不只是为此声明一个bean。它只需要一个Repositories