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 anular el ObjectMapper estándar cuando se trabaja con @SpringBootTest?

Digamos que tengo una clase de prueba. Aquí quiero cargar un contexto de aplicación personalizado con solo 1 bean y luego autowirearlo.

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = InnerWebConfig.class)
public class TarifControllerJsonTest {

private MockMvc mockMvc;

@MockBean
private CustomBean bean;

@Autowired
@Qualifier("testObjectMapper")
private ObjectMapper objectMapper;

@Before
public void setUp() {
    TarifControllerJson controller = new CustomContoller(bean);
    this.mockMvc = MockMvcBuilders.standaloneSetup(controller)
            .setCustomArgumentResolvers(new PageableHandlerMethodArgumentResolver())
            .build();
}

@Test
public void test1() throws Exception {
    String url = "/urlToControllerEndpoint";
    Request request = new Request();

    MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post(url)
                                                  .content(objectMapper.writeValueAsString(request))
                                                  .contentType(MediaType.APPLICATION_JSON)
                                                  .accept(MediaType.APPLICATION_JSON)).andReturn();
    int status = mvcResult.getResponse().getStatus();
    assertEquals(200, status);
}


}

InnerWegConfig.class:

@Configuration
public class InnerWebConfig {
@Bean(“testObjectMapper”)
public ObjectMapper objectMapper() {
return new CustomObjectMapper();
}
}

El bean se autowirea correctamente y puedo usarlo en el ámbito de la clase TarifControllerJsonTest. El problema principal es que Spring internamente todavía utiliza ObjectMapper predeterminado al tratar con ser/deserialización (por ejemplo, al validar una solicitud y pasarla al controlador).

¿Me falta algo o estoy haciendo algo completamente mal? Anular el bean no funciona aquí. Realmente apreciaría si pudieras ayudar aquí.

UPD: También intenté configurar los convertidores de Spring

@Configuration
@EnableWebMvc
public class InnerWebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
final AbstractJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(new TarifServiceObjectMapper());
converters.add(converter);
}
}

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que algo falta en la configuración. Necesitas configurar Spring para que use tu ObjectMapper personalizado cuando trate la serialización/deserialización. Puedes hacerlo mediante la anulación del método configureMessageConverters en tu clase InnerWebConfig. Esto te permitirá establecer el ObjectMapper que será utilizado por Spring al tratar la serialización/deserialización.

    @Configuration
    @EnableWebMvc
    public class InnerWebConfig implements WebMvcConfigurer {
        @Override
        public void configureMessageConverters(List<><?>> converters) {
            final AbstractJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
            converter.setObjectMapper(new TarifServiceObjectMapper());
            converters.add(converter);
        }
    }
    

Comments are closed.