我有一个Spring-Boot控制器,它反过来对另一个服务进行REST调用。因此,控制器中有一个RestTemplate客户端,它需要一个Json-Root-Value-Wrap-And-Unwrap功能。
根据常见的建议,我创建了一个客户ObjectMapper,如下所示
@Configuration
public class CustomJsonMapper {
@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.featuresToEnable(DeserializationFeature.UNWRAP_ROOT_VALUE);
return builder;
}
}所以我可以自动连接这个类,并在控制器内部的RestTemplate中使用。因此,控制器看起来有点像,
@RestController
@RequestMapping("uat")
public class UatController {
@Autowired
CustomObjectMapper customMapper;
@PostMapping(value = "startWork")
public ResponseEntity<?> startWork(@RequestBody startWorkInput startWorkInput) {
// Build the request
RestTemplate restTemp = new RestTemplate(factory);
restTemp.getMessageConverters().removeIf(m -> m.getClass().getName().equals(MappingJackson2HttpMessageConverter.class.getName()));
restTemp.getMessageConverters().add(new MappingJackson2HttpMessageConverter(customMapper));
// Proceed to make client call
}
}但是,我想这会导致SpringBoot中的默认ObjectMapper被覆盖。这就是为什么我还需要包装此服务的输入的根值。
有没有一种方法可以在不覆盖默认ObjectMapper的情况下使用自定义a。
发布于 2018-06-04 19:53:53
如果映射器仅本地化到一个bean,则可以将其声明为一个字段,而不是一个单独的bean:
@RestController
@RequestMapping("uat")
public class UatController {
private final ObjectMapper customMapper = Jackson2ObjectMapperBuilder.json()
.featuresToEnable(DeserializationFeature.UNWRAP_ROOT_VALUE)
.build();
...如果需要重用,可以尝试重新定义ObjectMapper beans并将缺省beans标记为@Primary
@Configuration
public class CustomJsonMapper {
@Bean
@Primary
public ObjectMapper objectMapper() {
return Jackson2ObjectMapperBuilder.json().build();
}
@Bean
public ObjectMapper customObjectMapper() {
return Jackson2ObjectMapperBuilder.json()
.featuresToEnable(DeserializationFeature.UNWRAP_ROOT_VALUE)
.build();
}
}然而,它比仅仅将更改本地化到需要它的单个控制器要复杂得多。此外,它违背了JacksonAutoConfiguration.JacksonObjectMapperBuilderConfiguration类中自动配置的约定。
https://stackoverflow.com/questions/50679854
复制相似问题