我正在按照post中的建议使用MappedInterceptor实现拦截器模式。
拦截器按预期工作,并且拦截@RestControllers
和Spring 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
特殊值,用于示例)...
谢谢...
答案 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
。