2015-12-09 72 views
1

後端,春季啓動項目(v1.3.0.RELEASE),供休息JSON API來弗朗年底,剛纔遇到一個錯誤:春天開機如何定製HttpMessageConverter

Infinite recursion (StackOverflowError) 

我決定更改爲自定義FastJsonHttpMessageConverter,並且代碼如下

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

    return fastJsonHttpMessageConverter; 
} 

,但它不工作,在現實,它使用一個默認HttpMessageConverter。雖然沒有上述錯誤,但輸出並不如我預期的那樣。例如

suppliers: [ 
    { 
     $ref: "$.value" 
    } 
] 

現在改變上面的代碼

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

這一次,它的工作原理,我想知道爲什麼該方法的名稱必須是mappingJackson2HttpMessageConverter?如果使用另一個方法名稱如何配置它?

+0

如何使用JSONITER而不是FastJson? – Bravo

+0

我們在JsonIter中有HttpMessageConverter嗎? – Bravo

回答

1

春天開機說(https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-responsebody-rendering):

If a bean you add is of a type that would have been included by default anyway (like MappingJackson2HttpMessageConverter for JSON conversions) then it will replace the default value.

要添加的bean是不是同一類型的,所以上述情況不會發生。你的轉換器在轉換器的列表中(可能是最後),第一個合適的轉換器(舊的轉換器)完成這項工作。

由Java配置生成的Bean具有該方法的名稱,因此當您創建名爲mappingJackson2HttpMessageConverter的第二個bean時,它會覆蓋Spring引導的JacksonHttpMessageConvertersConfiguration創建的bean並將其放置。

而不是增加一個轉換器bean的,您可能希望覆蓋轉換器的整個列表:

As in normal MVC usage, any WebMvcConfigurerAdapter beans that you provide can also contribute converters by overriding the configureMessageConverters method,

+0

我試過這段代碼來自定義'HttpMessageConvertor',但它不起作用。 '@SpringBootApplication public class FooApplication extends WebMvcConfigurerAdapter {0} {0} {0} {0} SpringApplication.run(FooApplication.class,args); } @Override public void configureMessageConverters(List >轉換器){ super.configureMessageConverters(轉換器); 轉換器。添加(新的FastJsonHttpMessageConverter()); } }' – zhuguowei

+0

你可以嘗試提供,而不是擴大它從一個FooApplication WebMvcConfigurerAdapter:公共類FooApplication {@Bean WebMvcConfigurerAdapter myAdapter(){ –

+0

在這裏看到一個例子https://github.com/spring-projects/spring-啓動/問題/ 2870 –

2

見狀offical document後,我知道如何自定義轉換器。

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

A修改我的主要帖子,其實下面的代碼不起作用。

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

如果您在其中設置斷點,Spring引導永遠不會輸入此方法。

下面的代碼也適用。

@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()); 
    } 

}