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);
}
}
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étodoconfigureMessageConverters
en tu claseInnerWebConfig
. Esto te permitirá establecer elObjectMapper
que será utilizado por Spring al tratar la serialización/deserialización.