SpringMVC4.3+fastjson1.2.39注意事项

项目框架升级SpringMVC从4.1.5.RELEASE 升级到 4.3.11.RELEASE,fastjson从1.2.5升级到1.2.39。mvc配置


    
        
        
    

    
        
            
            
                
            
            
            
                
                
                    
                        DisableCircularReferenceDetect
                    
                
            
        
    
    
    
        
    
    
    
        
        
        
            
                json=application/json
                xml=application/xml
            
        
    
使用的时候发现接口返回的json对象 Content-Type=application/javascript,H5使用倒没什么,但是Postman不能自动以Pretty形式展示看起来很纠结。
调试FastJsonHttpMessageConverter中的writeInternal(Object object, HttpOutputMessage outputMessage)方法

SpringMVC4.3+fastjson1.2.39注意事项_第1张图片

如果object继承自MappingFastJsonValue则认为返回Jsonp对象,会添加headers.setContentType(APPLICATION_JAVASCRIPT);操作,这样Content-Type的值就变成了application/javascript。而这里object就是MappingFastJsonValue对象。接口返回的对象什么时候被封装成了MappingFastJsonValue对象呢?

在RequestResponseBodyMethodProcessor的父类AbstractMessageConverterMethodProcessor中找到了原因:

SpringMVC4.3+fastjson1.2.39注意事项_第2张图片

这里实际调用了RequestResponseBodyAdviceChain的beforeBodyWrite方法

SpringMVC4.3+fastjson1.2.39注意事项_第3张图片

processBody加载ResponseBodyAdvice子类FastJsonpResponseBodyAdvice、JSONPResponseBodyAdvice、FastJsonViewResponseBodyAdvice,其中FastJsonpResponseBodyAdvice将原始的返回对象封装成了MappingFastJsonValue对象。

SpringMVC4.3+fastjson1.2.39注意事项_第4张图片

要解决该问题只要不加载FastJsonpResponseBodyAdvice即可。检查spring-mvc.xml的配置发现并没有扫描com.alibaba包,但是applicationContext.xml中base-package是com,且没有过滤ControllerAdvice注解,修改为


    
    
    
        
        
        
        
    

问题解决

你可能感兴趣的:(Spring,MVC)