è¿æ¥ç¨Spring3çMVCåä¸è¥¿ï¼æ·±æå
¶ä¹äºWebwork/Struts2ç便å©ï¼ä½æ¯å¨éè¿@ResponseBodyè¿ä¸ªannotationè¾åºä¸ä¸ªjsonå符串çæ¶åï¼åç°é¡µé¢ä¸è·å¾çjsonå符串ä¸æå符åºç°äºä¹±ç çç°è±¡ãéè¿firefoxè§å¯è¿åçå符串ï¼ä¸æé¨åå
¨é¨åæäºï¼ï¼ï¼ï¼ï¼ï¼ï¼çå½¢å¼ï¼åæ¥å¤å®æ¯è¿åæ¶ï¼springå¤ç@ResponseBody使ç¨äºé误çç¼ç ã
å 为æå¨web.xmlä¸å·²ç»é
ç½®äºSpringçCharacterEncodingFilterï¼å¹¶ä¸å¼ºå¶å°requeståresponseçç¼ç é½æå®ä¸ºutf-8ï¼æ以åºç°ä¹±ç çåå è¯å®æ¯å¨Springå
é¨æå¤çé»è¾äºã
ælog4jä¸å
³äºspringçè¾åºçº§å«è°ä¸ºdebugï¼éè¿è®¿é®åºé®é¢çå°åï¼åç°Springå¨å¤ç@ResponseBodyè¿ä¸ªannotationçæ¶åï¼org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter使ç¨äºorg.springframework.http.converter.StringHttpMessageConverterè¿è¡å¤çï¼äºæ¯æå¼äºSpringçæºç ï¼ççè¿ä¸ªç±»ç©¶ç«åäºåªäºäºæ
ã
ä¸çä¸è¦ç´§ï¼ä¸çåä¸è·³ï¼éé¢ç«ç¶æ¯è¿æ ·å®ä¹å
¶é»è®¤ç¼ç çï¼
1 | public  static  final  Charset DEFAULT_CHARSET = Charset.forName( "ISO-8859-1" ); |
é¡¿æ¶å¿çNç§ä¸ç½ï¼å å Springï¼ç«ç¶è¿å¨å
¶ä¸ç¨è¥¿æ¬§å符éä½ä¸ºå
¶é»è®¤ç¼ç ï¼åç¹åï¼ï¼å¾å¤springçç±»ä¸ï¼æ¶åç¼ç çå·²ç»é½æ¯utf-8äºï¼æ¯å¦è´è´£JSONè§å¾çMappingJacksonHttpMessageConverterï¼å°±æ¯é»è®¤ä½¿ç¨UTF-8ï¼ãæ¬æ¥æ³ç´æ¥ä¿®æ¹springçæºç éæ°æå
ä¸ä¸ªjaråºæ¥ï¼åæ¥çspringçjava docåç°ï¼å
¶ç¶ç±»org.springframework.http.converter.AbstractHttpMessageConverterä¸çgetDefaultContentTypeæ¹æ³æ¯å¯ä»¥éåçï¼
By default, this returns the first element of the supportedMediaTypes property, if any. Can be overridden in subclasses.
å¿æ³è¿ä¸å°±ç®åäºï¼ä½ çDEFAULT_CHARSETä¸æ¯finalä¹ï¼é£æèªå·±ç»§æ¿ä¸ä¸ªåºæ¥ï¼æç
§æçéæ±å®ä¹ä¸ºutf-8ä¸å°±å¾äºï¼ä»£ç å¦ä¸ï¼
01 | public  class  UTF8StringHttpMessageConverter extends StringHttpMessageConverter { |
03 |  private  static  final  MediaType utf8 = new  MediaType( "text" , "plain" , |
04 | Â Charset.forName( "UTF-8" )); |
05 |  private  boolean  writeAcceptCharset = true ; |
08 |  protected  MediaType getDefaultContentType(String dumy) { |
12 |  protected  List<Charset> getAcceptedCharsets() { |
13 |  return  Arrays.asList(utf8.getCharSet()); |
16 |  protected  void  writeInternal(String s, HttpOutputMessage outputMessage) |
17 |  throws  IOException { |
18 |  if  ( this .writeAcceptCharset) { |
19 | Â outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets()); |
21 | Â Charset charset = utf8.getCharSet(); |
22 |  FileCopyUtils.copy(s, new OutputStreamWriter(outputMessage.getBody(), |
26 |  public  boolean  isWriteAcceptCharset() { |
27 |  return  writeAcceptCharset; |
30 |  public  void  setWriteAcceptCharset( boolean  writeAcceptCharset) { |
31 | Â this .writeAcceptCharset = writeAcceptCharset; |
ç¶åï¼å¨springçé
ç½®æ件ä¸æ·»å å¦ä¸bean声æï¼ç¨èªå·±åçç±»æ¿æ¢æåæçStringHttpMessageConverterï¼
1 | < bean class = "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" > |
2 |     < property  name = "messageConverters" > |
3 | Â Â Â Â Â Â Â Â < list > |
4 |             < bean  id = "utf8StringHttpMessageConverter" class = "xxx.xxx.UTF8StringHttpMessageConverter"  /> |
5 | Â Â Â Â Â Â Â Â </ list > |
åçéè¿@ResponseBodyè¿åçjsonå符串ï¼ç»äºä¸æé½å¯ä»¥æ£å¸¸æ¾ç¤ºäºã