Permitir a Spring tiene múltiples implementaciones WebMvcConfigurer en diferentes frascos

user1884155:

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 WebMvcConfigurerinterfaz:

@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:

  1. Crear un "común-jar", y poner la interfaz anteriormente en el paquete
    com.company.api.
  2. En cada aplicación, agregar el paquete com.company.apia 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 WebMvcConfigureraplicació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 WebMvcConfigurerinterfaz 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.

Ken Chan

Si entiendo bien su pregunta, básicamente desea definir algunos comunes Interceptorsen múltiples archivos JAR de tal manera que una aplicación puede activar estos Interceptorssimplemente 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 WebMvcConfigurerfrijoles, primavera simplemente bucle ellos uno por uno y pide sus métodos de configuración. Por lo que el resultado final es que InterceptorRegistrycontendrá todos los interceptores.

Si la necesidad de aplicación de cliente para activar ciertos WebMvcConfigurerúnica, puede simplemente excluir esos frascos que contienen la WebMvcConfigurerque ellos no quieren.

Para tomar esta idea adicional que permite que la aplicación de control que Interceptorspara 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/ excludeFiltersen @ComponentScanpersonalizar 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)
    })

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=337235&siteId=1
Recomendado
Clasificación