Saltar al contenido

¿Se puede habilitar / deshabilitar un Spring Boot @RestController usando propiedades?

Solución:

Encontré una solución simple usando @ConditionalOnExpression:

@RestController
@ConditionalOnExpression("${my.controller.enabled:false}")
@RequestMapping(value = "foo", produces = "application/json;charset=UTF-8")
public class MyController {
    @RequestMapping(value = "bar")
    public ResponseEntity<String> bar(
        return new ResponseEntity<>("Hello world", HttpStatus.OK);
    }
}

Con esta anotación agregada, a menos que tenga

my.controller.enabled=true

en mi application.properties archivo, el controlador no se iniciará en absoluto.

También puede utilizar el más conveniente:

@ConditionalOnProperty("my.property")

Que se comporta exactamente como arriba; si la propiedad está presente y "true", el componente se inicia, de lo contrario no lo hace.

En algunos casos, @ConditionalOnXXX no puede funcionar, por ejemplo, depende de otra instancia de bean para verificar la condición. (La clase XXXCondition no puede invocar un bean).

En tal caso, registre el controlador en el archivo de configuración de Java.

Ver código fuente (Spring webmvc 5.1.6):

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.isHandler (Clase)

       @Override
       protected boolean isHandler(Class<?> beanType) {
              return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
                           AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
       }

Debería agregar la anotación @RequestMapping en el nivel de tipo para el bean controlador. Ver:

@RequestMapping // Make Spring treat the bean as request hanlder
public class MyControllerA {
    @RequestMapping(path = { "/path1" })
    public .. restMethod1(...) {
  ........
    }
}

@RequestMapping // Make Spring treat the bean as request hanlder
public class MyControllerB {
    @RequestMapping(path = { "/path1" })
    public .. restMethod1(...) {
  ........
    }
}

@Configuration
public class ControllerConfiguration {

    /**
     *
     * Programmingly register Controller based on certain condition.
     *
     */
    @Bean
    public IMyController myController() {
        IMyController controller;
        if (conditionA) {
            cntroller = new MyControllerA();
        } else {
            controller = new MyControllerB();
        }
        return controller;
    }
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *