Eu gostaria de escolher 1 de 2 classes com @Bean
base em uma propriedade do sistema usando primavera básica. Uma variante muito diluída ficaria assim
@Configuration(value = "BipBop")
@EnableWebMvc
public class BipBopConfiguration implements WebMvcConfigurer {
@Bean
public BipBop getBipBop() {
if (Boolean.getBoolean("isBip")) {
return new Bip();
} else {
return new Bop();
}
}
}
@Controller
@RequestMapping("/bipbop")
public class Bip implements BipBop {
@RequestMapping(method = RequestMethod.GET)
public void bipBop(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try (PrintWriter pw = new PrintWriter(new OutputStreamWriter(response.getOutputStream()))) {
pw.println("Bip");
pw.flush();
}
}
}
@Controller
@RequestMapping("/bipbop")
public class Bop implements BipBop {
@RequestMapping(method = RequestMethod.GET)
public void bipBop(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try (PrintWriter pw = new PrintWriter(new OutputStreamWriter(response.getOutputStream()))) {
pw.println("Bop");
pw.flush();
}
}
}
O problema que vejo é que, embora @Bean
escolha a implementação correta, ele não vê a classe escolhida como a e @Controller
, portanto, quando você acessa o servidor, /bipbop
obtém 404s.
Se ambas as classes estiverem no caminho de varredura, o Spring as reconhece como controladores, mas reclama que há um conflito entre /bipbop
duas implementações.
Como dizer à primavera para fazer isso? Eu vejo, @ConditionalOnProperty
mas parece ser apenas para bota de mola, pelo que posso dizer.
Se quiser habilitar condicionalmente um controlador com base em um valor de propriedade de um arquivo de propriedades em um aplicativo Spring, você pode usar
@Conditional
:Supondo que você tenha uma classe de controlador chamada
MyController
:Agora, vamos habilitar este controlador condicionalmente com base em um valor de propriedade:
Observe a adição de
@Conditional(MyControllerCondition.class)
naMyController
classe. Agora vamos criar aMyControllerCondition
classe:Esta classe de condição verifica se a propriedade
my.config.enabled
está definida e possui o valor 'true'. Se a condição não for atendida, aMyController
classe não será aplicada.Lembre-se de carregar o arquivo de propriedades em seu aplicativo Spring. Você pode usar a
@PropertySource
anotação em sua classe de configuração principal ou por meio dos arquivosapplication.properties
ouapplication.yml
.Agora, o
MyController
será habilitado condicionalmente com base no valor da propriedade, permitindo controlar sua ativação em diferentes ambientes.