Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用不同的jackson对象映射器进行单独的请求映射_Java_Spring_Spring Boot_Jackson_Objectmapper - Fatal编程技术网

Java 使用不同的jackson对象映射器进行单独的请求映射

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

我有一个使用自定义MIME类型的
@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的回答更加简洁明了。