Cuando se utiliza la primavera Web, en este caso para los puntos finales para el descanso y el uso de la primavera de arranque 2, puedo configurar interceptores para mi aplicación utilizando mediante la implementación de la WebMvcConfigurer
interfaz:
@Configuration
public class SpringWebConfig implements WebMvcConfigurer
{
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor).addPathPatterns("/api/endpoint/**");
}
}
He añadido este interceptor a la mayoría de mis aplicaciones de forma automática mediante el procedimiento siguiente:
- Crear un "común-jar", y poner la interfaz anteriormente en el paquete
com.company.api
. - En cada aplicación, agregar el paquete
com.company.api
a la exploración de la API.
Este paquete común también contiene las clases del interceptor y de servicios públicos para hacer este trabajo interceptor, lo que en efecto, la adición de este común-jar añadiría automáticamente que interceptor para todas las operaciones en la aplicación, que es un concepto similar en cuanto a lo que hace en sí primavera: la adición dependencias cambia la configuración por defecto de la primavera.
El problema que estoy enfrentando ahora es este enfoque no puede extenderse a una segunda interceptor en un segundo frasco, porque ya he utilizado la WebMvcConfigurer
aplicación. y no puedo tener dos.
Estaba pensando en tal vez el uso de algún tipo de patrón Composite-configurador en el que un bucle sobre cada configurador, recoger todos los interceptores, y luego añadir una vez, pero por desgracia la primavera no lo permite. ¿Cuáles son mis opciones?
En la actualidad, el enfoque Tomé está duplicando la WebMvcConfigurer
interfaz en cada aplicación que lo requiera. Me siento triste cuando algo cambia, y tengo que cambiar el mismo fragmento de código en cada aplicación.
Si entiendo bien su pregunta, básicamente desea definir algunos comunes Interceptors
en múltiples archivos JAR de tal manera que una aplicación puede activar estos Interceptors
simplemente incluyendo estos recipientes en su aplicación?
Estaba pensando en tal vez el uso de algún tipo de patrón Composite-configurador en el que un bucle sobre cada configurador, recoger todos los interceptores, y luego añadir una vez, pero por desgracia la primavera no lo permite. ¿Cuáles son mis opciones?
Bueno, si la implementación Un devuelve un registro con sólo el interceptor A, y vuelve aplicación B un registro con sólo el interceptor B, surgiría combinar ambos registros en un registro de súper que contiene tanto A como B, o sería simplemente escoger uno, o sería tirar un error que no existía una definición única de frijol?
En realidad, la primavera ya ha implementar esta característica . Cuando hay varios WebMvcConfigurer
frijoles, primavera simplemente bucle ellos uno por uno y pide sus métodos de configuración. Por lo que el resultado final es que InterceptorRegistry
contendrá todos los interceptores.
Si la necesidad de aplicación de cliente para activar ciertos WebMvcConfigurer
única, puede simplemente excluir esos frascos que contienen la WebMvcConfigurer
que ellos no quieren.
Para tomar esta idea adicional que permite que la aplicación de control que Interceptors
para activar hasta el nivel del interceptor, incluso se podría hacer lo siguiente en cada frasco común:
@Configuration
public class SpringWebConfig implements WebMvcConfigurer {
//Make sure the HandlerInterceptor implementation in this JAR is a bean (e.g mark it as @Component)
@Autowired
private List<HandlerInterceptor> interceptors;
@Override
public void addInterceptors(InterceptorRegistry registry) {
for(HandlerInterceptor interceptor : interceptors){
registry.addInterceptor(interceptor).addPathPatterns("/api/endpoint/**");
}
}
}
En la aplicación cliente, el uso includeFilters
/ excludeFilters
en @ComponentScan
personalizar los interceptores a incluir. Por ejemplo, para desactivar ciertas Interceptors
, se puede hacer:
@ComponentScan(
basePackages = {"com.company.api"},
excludeFilters={
@ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=com.company.common.jar1.Inteceptor1.class) ,
@ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=com.company.common.jar2.Inteceptor1.class)
})