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;
}
}