有没有办法从 Spring 中的外部库注入拦截器?
Is there any way to inject Interceptor from external library in Spring?
我正在开发一个 jar 库并试图从外部 jar 库向应用程序注入一个拦截器。
例如:
外部库
MyExternalInterceptor.java
public class MyExternalInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// Do something
}
}
我尝试在外部库中使用 AOP,但它不起作用。
InterceptorAspect.java
@Around("execution(* org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.addInterceptors(..))")
public Object aspect(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
// Tried to inject MyExternalInterceptor here
Object result = proceedingJoinPoint.proceed();
return result;
}
在使用该库的应用程序中:
申请
MyConfiguration.java
@Configuration
public MyConfiguration extends WebMvcConfigurationSupport {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SpringTestInterceptor()); // client's own interceptor
/* Add MyExternalInterceptor not explicitly but implicitly using AOP or other things */
}
}
有什么方法可以从外部库向应用程序注入拦截器吗?
我知道这个问题很晦涩(对此深表歉意),但你能给我任何建议或提示以使其有效吗?
感谢所有阅读我的问题的人:)
(为了澄清,我更新了更多细节)
总结
- 在客户端和库端使用
WebMvcConfigurer
而不是 WebMvcConfigurationSupport
- 不需要 AoP
我使用 WebMvcConfigurer
而不是 WebMvcConfigurationSupport
并更改如下代码:
外部库
MyExternalInterceptor.java
- 和以前一样
InterfaceAspect.java
- 不再需要它了
MyExternalLibConfiguration.java
@Configuration
public class MyExternalLibConfiguration implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyExternalInterceptor());
}
}
应用程序(客户端)
MyConfiguration.java
@Configuration
public MyConfiguration implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SpringTestInterceptor()); // client's own interceptor
/* No need to add MyExternalInterceptor in here */
}
}
就这些!正如 M. Deinum 在评论中所说,一切正常。
再次感谢 Deinum!
我正在开发一个 jar 库并试图从外部 jar 库向应用程序注入一个拦截器。
例如:
外部库
MyExternalInterceptor.java
public class MyExternalInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// Do something
}
}
我尝试在外部库中使用 AOP,但它不起作用。
InterceptorAspect.java
@Around("execution(* org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.addInterceptors(..))")
public Object aspect(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
// Tried to inject MyExternalInterceptor here
Object result = proceedingJoinPoint.proceed();
return result;
}
在使用该库的应用程序中:
申请
MyConfiguration.java
@Configuration
public MyConfiguration extends WebMvcConfigurationSupport {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SpringTestInterceptor()); // client's own interceptor
/* Add MyExternalInterceptor not explicitly but implicitly using AOP or other things */
}
}
有什么方法可以从外部库向应用程序注入拦截器吗?
我知道这个问题很晦涩(对此深表歉意),但你能给我任何建议或提示以使其有效吗?
感谢所有阅读我的问题的人:)
(为了澄清,我更新了更多细节)
总结
- 在客户端和库端使用
WebMvcConfigurer
而不是WebMvcConfigurationSupport
- 不需要 AoP
我使用 WebMvcConfigurer
而不是 WebMvcConfigurationSupport
并更改如下代码:
外部库
MyExternalInterceptor.java
- 和以前一样
InterfaceAspect.java
- 不再需要它了
MyExternalLibConfiguration.java
@Configuration
public class MyExternalLibConfiguration implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyExternalInterceptor());
}
}
应用程序(客户端)
MyConfiguration.java
@Configuration
public MyConfiguration implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SpringTestInterceptor()); // client's own interceptor
/* No need to add MyExternalInterceptor in here */
}
}
就这些!正如 M. Deinum 在评论中所说,一切正常。
再次感谢 Deinum!