es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo realizar una autoconexión por nombre en lugar de tipo.

Sé que no soy el primero en tener este problema, pero estoy luchando por crear múltiples beans del mismo tipo en Spring Boot 2.5.4.

Mi configuración:

@Configuration
public class MapperConfig {

@Bean("yamlMapper")
public ObjectMapper yamlMapper() {
    return new ObjectMapper(new YAMLFactory());
}

@Bean("jsonMapper")
public ObjectMapper jsonMapper() {
    return new ObjectMapper();
}


}

Y mi clase de servicio:
java
@Service
@RequiredArgsConstructor 
public class MapperService {

@Qualifier("jsonMapper")
private final ObjectMapper jsonMapper;

@Qualifier("yamlMapper")
private final ObjectMapper yamlMapper;


}

El error es el siguiente:

No se encuentra ningún bean calificado del tipo ‘com.fasterxml.jackson.databind.ObjectMapper’: se esperaba un único bean coincidente, pero se encontraron 2: yamlMapper,jsonMapper

He intentado varias combinaciones de @Bean, @Qualifier, etc. sugeridas en otros publicaciones de SO y en la documentación, pero no puedo encontrar una manera de hacer que Spring se conecte automáticamente por nombre en lugar de tipo. ¡Cualquier ayuda sería muy apreciada!

SOLUCIÓN:

Como señaló Youssef, no es que MapperService no pueda encontrar el bean correcto, es la clase MappingJackson2HttpMessageConverterConfiguration de Spring Boot la que falla. No podemos agregar anotaciones a esa clase, así que tenemos que recurrir a usar @Primary en nuestra configuración.

El contexto se carga correctamente de la siguiente manera:

@Configuration
public class MapperConfig {

@Bean
public ObjectMapper yamlMapper() {
    return new ObjectMapper(new YAMLFactory());
}

@Bean
@Primary
public ObjectMapper jsonMapper() {
    return new ObjectMapper();
}


}


@Service
@RequiredArgsConstructor
public class MapperService {

@Autowired
@Qualifier("jsonMapper")
private final ObjectMapper jsonMapper;

@Autowired
@Qualifier("yamlMapper")
private final ObjectMapper yamlMapper;


}
Tags:  , , ,

Answer

Comments are closed.