Então, eu tenho essa classe que pertence a uma biblioteca externa (então não posso modificá-la):
@Configuration
@EnableWebMvc
@Slf4j
public class WebConfigParent implements WebMvcConfigurer {
private final ObjectMapper objectMapper;
public WebConfigParent(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new ResourceHttpMessageConverter());
converters.add(new StringHttpMessageConverter());
converters.add(new ByteArrayHttpMessageConverter());
converters.add(mappingJackson2HttpMessageConverter());
}
@Bean //this is the issue!
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
return new MappingJackson2HttpMessageConverter(objectMapper);
}
Agora, minha turma:
@Configuration
public class WebConfigChild extends WebConfigParent {
public WebConfigChild(ObjectMapper objectMapper) {
super(objectMapper);
}
Falha devido a:
O bean 'mappingJackson2HttpMessageConverter', definido no recurso de caminho de classe [../WebConfigParent], não pôde ser registrado. Um bean com esse nome já foi definido no recurso de caminho de classe [../WebConfigChild.class] e a substituição está desabilitada.
Considere renomear um dos beans ou habilitar a substituição definindo spring.main.allow-bean-definition-overriding=true
Eu sei que é perigoso usar a configuração override (que, a propósito, funciona), mas não tenho ideia de como evitar esse comportamento! Tentei redefinir o método na classe filha assim:
@Bean(name="anotherMapper")
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
return super.mappingJackson2HttpMessageConverter();
}
mas continua o mesmo erro...por quê??
Já que
WebConfigParent
é anotado com@Configuration
, ele será criado como uma classe de configuração adicional, mesmo que seja estendido porWebConfigChild
. Você pode excluirWebConfigParent
da varredura de componentes.Tente adicionar algo como: