Spring MVCレスポンス文字化け

4270 ワード

spring 4.2.2responsebody utf-8文字化けの問題はずっと頭が痛い話題です.文字化けの原因は様々で、めちゃくちゃです.本文はSpring MVCに関するさまざまなケースを集めた集合として、更新を続けましょう.
前提
  • 応答文はJSON形式であり、@Request Mappingのproduces={appication/json}属性により実現
  • 手がかりが整理されている
    1.Controllerで返却対象タイプSpring MVCがJson文字列に戻るには基本的に2つの方式があり、第一に、controllerの方法はJson形式の文字列に直接戻り、第二に、Form、List、Mapなどの順序付け可能なオブジェクトを返し、Spring統合Jacksonを配置してjson変換を行う.
    2.StringHttp Message Coverterの配置コードを確認する(方式1)controllerが戻ってきたのは文字列であるため、SpringはレスポンスのoutputStreamにブラシを入れるだけでよい.しかし、ブラシを入れる時に使う具体的なコードは何ですか?StringHttp Message Coverterのソースコードを見ることができますDEFAULT_CHARSET = Charset.forName("ISO-8859-1")dispatcher-servlet.xmlでUTF-8に変更すればいいです.
     
        
            
                
                    
                    
                    
                
            
        
     
    
    3.MappingJackson 2 Http Message Coverterの配置コードを確認する(方式2)この変換類のデフォルトコードはUTF-8ですので、ここでは符号化問題が発生しないはずです.手動設定がこのような場合.
     
        
            
                text/html;charset=UTF-8
                application/json;charset=UTF-8
            
        
     
    
    4.Spring APIが古いときdispatcher-servlet.xmlで使用された場合、3.1の前にAnnotationMethodhandler Adapterをデフォルトで注入した場合、3.1の後にRequest MappingHandler Adapterをデフォルトで注入します.使用していない場合は、手動で声明を追加する必要があります.例は以下の通りです.
     
        
            
                
                    
                        
                            text/html;charset=UTF-8
                            application/json;charset=UTF-8
                        
                    
                
            
        
     
    
     
        
            
                
                    
                        text/plain; charset=UTF-8
                        text/html; charset=UTF-8
                        application/json; charset=UTF-8
                    
                
            
            
                
                    
                        application/json; charset=UTF-8
                        application/x-www-form-urlencoded; charset=UTF-8
                    
                
            
        
    
    
    文字化けシーン1
    controllerでの方法は以下のように定義されていますので、満足のいく形で使用しました.最終応答は文字化けです.解決策は2つあります.A.producesの値を{appication/json;charset=utf-8}に変更して、最も簡単で直感的ですが、すべての方法において修正します.B.dispatcher-servlet.xmlにStringHttpMessage Converterを追加する構成は無駄です.なぜなら、どうしても有効にならないということが分かります.これはproducesの中にはaplication/jsonしか設定されていないので、StringHttpMessageConverter.getContentTypeCharset(MediaType contentType)の参加中に、MediaTypeは永遠にappication/jsonだけあって、charsetを取得できません.上にconverterを追加する方式を採用し、producesの削除を確保することができます.
    このシーンは最終的に一つの問題だけを説明します.producesのMediaTypeはtype subtype(json)とcharset(utf-8)を含みます.
    @RequestMapping(value = "queryIdCard", method = RequestMethod.POST, produces = {"application/json"})
    @ResponseBody
    public String queryIdCard(@RequestBody String idCardNo) {
        MeResponse response = idCardBusiness.queryPersonInfo(idCardNo);
        return JsonUtil.toJsonString(response);
    }