Spring启动如何自定义HttpMessageConverter

时间:2015-12-09 06:32:31

标签: spring-boot

后端,Spring启动项目( v1.3.0.RELEASE ),将Rest JSON Api提供给fron-end,刚刚遇到错误:

@Bean
public HttpMessageConverter httpMessageConverter() {
    FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();

    return fastJsonHttpMessageConverter;
}

我决定更改为自定义FastJsonHttpMessageConverter,代码位于

之下
HttpMessageConverter

但它不起作用,实际上它使用默认的suppliers: [ { $ref: "$.value" } ] 。虽然没有上述错误,但输出并不像我预期的那样。 e.g。

@Bean
public HttpMessageConverter mappingJackson2HttpMessageConverter() {
    FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
    return fastJsonHttpMessageConverter;
}

现在更改上面的代码

mappingJackson2HttpMessageConverter

这次它有效,我想知道为什么方法名称必须是SELECT t1.ID1, t1.ID2, t1.Name1, t1.Name2, t1.date FROM tblSomething t1 INNER JOIN ( SELECT ID1, ID2, MAX(date) AS date FROM tblSomething GROUP BY ID1, ID2 ) t2 ON t1.ID1 = t2.ID1 AND t1.ID2 = t2.ID2 AND t1.date = t2.date ?如果使用其他方法名称如何配置它?

2 个答案:

答案 0 :(得分:4)

看到这个offical document后,我知道如何自定义转换器。

@Bean
public HttpMessageConverters customConverters() {
    HttpMessageConverter<?> additional = new FastJsonHttpMessageConverter();
    return new HttpMessageConverters(additional);
}

修改我的主要帖子,实际上在代码下面不起作用。

@Bean
public HttpMessageConverter mappingJackson2HttpMessageConverter() {
    FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
    return fastJsonHttpMessageConverter;
}

如果在其中设置断点,则Spring boot永远不会进入此方法。

以下代码也有效。

@SpringBootApplication
public class FooApplication extends WebMvcConfigurerAdapter {


   public static void main(String[] args) {
       SpringApplication.run(FooApplication.class, args);
  }

  @Override
  public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    super.configureMessageConverters(converters);
    converters.add(new FastJsonHttpMessageConverter());
  }

}

答案 1 :(得分:2)

Spring boot说(https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-responsebody-rendering):

  

如果你添加的bean是默认包含的类型(比如MappingJackson2HttpMessageConverter用于JSON转换),那么它将替换默认值。

您要添加的bean的类型不同,因此上述情况不会发生。您的转换器位于转换器列表中的某个位置(可能是结束位置),第一个合适的转换器(旧转换器)可以完成工作。

Java配置生成的bean具有方法的名称,因此当您创建名为mappingJackson2HttpMessageConverter的第二个bean时,它会覆盖spring boot的JacksonHttpMessageConvertersConfiguration创建的bean并将其取代。

您可能更愿意覆盖整个转换器列表,而不是添加转换器bean:

  

与正常的MVC使用情况一样,您提供的任何WebMvcConfigurerAdapter bean也可以通过覆盖configureMessageConverters方法来提供转换器,