Java 使用不同的jackson对象映射器进行单独的请求映射
我有一个使用自定义MIME类型的Java 使用不同的jackson对象映射器进行单独的请求映射,java,spring,spring-boot,jackson,objectmapper,Java,Spring,Spring Boot,Jackson,Objectmapper,我有一个使用自定义MIME类型的@RequestMapping。请求使用@配置中定义的对象映射器bean来启用JsonParser.Feature。允许反斜杠转义\u任何字符 此功能允许使用通常无效的json(将反斜杠视为非特殊字符),这是此特定@RequestMapping的一个要求,以允许直接解析google编码的多段线。然而,这意味着这个ObjectMapper现在被用于我所有的@RequestMapping,而实际上它只是一个需求 是否有方法区分每个@Controller或@Reques
@RequestMapping
。请求使用@配置中定义的对象映射器bean来启用JsonParser.Feature。允许反斜杠转义\u任何字符
此功能允许使用通常无效的json(将反斜杠视为非特殊字符),这是此特定@RequestMapping
的一个要求,以允许直接解析google编码的多段线。然而,这意味着这个ObjectMapper现在被用于我所有的@RequestMapping
,而实际上它只是一个需求
是否有方法区分每个@Controller
或@RequestMapping
使用的ObjectMapper
对象映射器Bean
@Bean
public ObjectMapper objectMapper() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.featuresToEnable(
JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER);
return builder.build();
}
请求映射接口方法
@ApiOperation(value = "Returns the toll cost breakdown for a journey", notes = "", response = TotalCost.class, tags={ "pricing", })
@ApiResponses(value = {
@ApiResponse(code = 200, message = "successful operation", response = TotalCost.class) })
@RequestMapping(value = "/pricing/journeyCost",
produces = { "application/json" },
consumes = { "application/vnd.toll-pricing+json" },
method = RequestMethod.POST)
ResponseEntity<TotalCost> getTollBreakdownFromEncodedPoly(@ApiParam(value = "Request object representing the journey" ,required=true ) @RequestBody Journey body);
@ApiOperation(value=“返回旅程的通行费成本明细”,notes=“”,response=TotalCost.class,tags={“pricing”,})
@ApiResponses(值={
@ApiResponse(code=200,message=“成功操作”,response=TotalCost.class)})
@请求映射(value=“/pricing/journeyCost”,
生成={“应用程序/json”},
消费={“应用程序/vnd.toll定价+json”},
method=RequestMethod.POST)
ResponseEntity getTollBreakdownFromEncodedPoly(@ApiParam(value=“代表旅程的请求对象”,required=true)@RequestBody旅程正文);
如果您有一个自定义MIME类型,那么您可以注册一个自定义,该自定义为您的MIME类型使用一个特殊的ObjectMapper
,并从canRead/canWrite
返回false
,用于常规MIME类型。您可以像这样注册自定义的HttpMessageConverter
:
@EnableWebMvc
@Configuration
@ComponentScan
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(
List<HttpMessageConverter<?>> converters) {
messageConverters.add(myCustomMessageConverter());
super.configureMessageConverters(converters);
}
}
@EnableWebMvc
@配置
@组件扫描
公共类WebConfig扩展了WebMVCConfigureAdapter{
@凌驾
公共无效配置MessageConverters(
List我在另一个用户链接到我的stackoverflow问题中找到了答案-
我只需将以下@Bean
添加到我的@Configuration
@Bean
public HttpMessageConverters customConverters() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.featuresToEnable(
JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER);
final AbstractJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(builder.build());
converter.setSupportedMediaTypes(Collections.singletonList(MediaType.valueOf("application/vnd.toll-pricing+json")));
return new HttpMessageConverters(converter);
}
您是否只需要旅程界面的自定义处理?@lexknuther基本上是的。另外,您使用的是什么版本的Jackson?在这里您可以找到解决您问题的可能方案-@lexknuther 2.6.6了解内容协商,并对我的问题发表评论,为我指明了正确的方向。我毫不怀疑上述解决方案将有助于解决您的问题Jags我看了另一个线程中Szymon Stepniak的内容,除了注册转换器的部分外,它与我所说的完全相似。当你说你不怀疑上面的内容是否有效时,我怀疑你是否真的不理解发生了什么。我不反对你的答案我也同意我可能不完全理解其中的复杂性,但这也可能反映了你的答案的质量?我应用了你的答案,根据我的理解,我创建了一个自定义的HttpMessageConverter
实现,并覆盖了将方法简化为只接受一个MediaType
。Szymons的回答更加简洁明了。