RestTemplate踏坑笔记-中国语の文字化けしとjsonはxmlに解析されます

4719 ワード

1.RestTemplateアクセスRestfullインタフェース:中国語文字化けし+戻りデータフォーマットxml
Spring Cloudプロジェクトは、コンポーネント間のHttp通信に必ず使用されます.springが提供する簡単で便利なテンプレートクラス:RestTemplateを使用しています.
Restfullインタフェースは次のとおりです.
@RestController
@RequestMapping("/logonLog")
public class LogonLogController {
    private Logger logger = LoggerFactory.getLogger(LogonLogController.class);

    @Resource
    private LogonLogService logonLogService;

    @RouterAttribute(id = MyLogRouter.GET_LOGON_LOG_BY_PAGE ,description = "        ")
    @RequestMapping(value = "/getPageList",method = RequestMethod.GET)
    public ResponseEntity getPageList(Integer currentPage,Integer pageSize){
        if(currentPage == null || pageSize == null){
            return MyResponse.badRequest();
        }
        return ResponseEntity.ok(logonLogService.getPageList(currentPage,pageSize));
    }
}

要求:restTemplate.getForEntity(routerUrl,String.class,map);
String urlParameters = getUrlParametersWithUserId(parameters);
                    routerUrl += urlParameters;
                    //    
                    Map map = parseMapWithUserId(parameters);
                    logger.info("get  methodName:" + methodName + ",url:" + routerUrl);
                    responseEntity = restTemplate.getForEntity(routerUrl,String.class,map);

200を返して、これは大丈夫で、重点は:Restfullインタフェースにアクセスして意外にもXMLフォーマットのデータを返します!!!しかも中国語は文字化けしている.
RestTemplate踩坑笔记-中文乱码与json被解析成xml_第1张图片
2.中国語の文字化けしを解決する
実は中国語の文字化けしの問題に対して私は予想して、restTemplateのMessageConvertersの集合の中でStringHttpMessageConverterに参加して、コードは以下の通りです:
RestTemplate restTemplate =new RestTemplate();
restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));

文字化けしの問題解決
3.戻りXML問題の解決
この問題は奇妙で、私のプロジェクトには5つのコンポーネントがあり、いずれもRestfullインタフェースですが、一部のコンポーネントにアクセスすると正常なjsonが返され、一部のコンポーネントはxmlが返されます.各コンポーネントにpostmanを使用して直接アクセスし、正常なjsonを返します.では意外なことに、RestTemplateがいたずらをしているはずです.
何も言わずにソースコードをすり抜けて、怪しいやつを見つけた:jackson 2 XmlPresent
public RestTemplate() {
	this.messageConverters.add(new ByteArrayHttpMessageConverter());
	this.messageConverters.add(new StringHttpMessageConverter());
	this.messageConverters.add(new ResourceHttpMessageConverter(false));
	this.messageConverters.add(new SourceHttpMessageConverter<>());
	this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
	if (romePresent) {
		this.messageConverters.add(new AtomFeedHttpMessageConverter());
		this.messageConverters.add(new RssChannelHttpMessageConverter());
	}
	if (jackson2XmlPresent) {
		this.messageConverters.add(new MappingJackson2XmlHttpMessageConverter());
	}
	else if (jaxb2Present) {
		this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
	}
        if (jackson2Present) {
		this.messageConverters.add(new MappingJackson2HttpMessageConverter());
	}
	else if (gsonPresent) {
		this.messageConverters.add(new GsonHttpMessageConverter());
	}
	else if (jsonbPresent) {
		this.messageConverters.add(new JsonbHttpMessageConverter());
	}
	if (jackson2SmilePresent) {
		this.messageConverters.add(new MappingJackson2SmileHttpMessageConverter());
	}
	if (jackson2CborPresent) {
		this.messageConverters.add(new MappingJackson2CborHttpMessageConverter());
	}
}

もとはRestTemplateのmessageConvertersの中でこんなに多くのメンバーが常駐していて、他の私は気にしないで、このjackson 2 XmlPresentは命を要した鬼で、私は直接証拠がなくてそれが私のjsonをXmlに変えたことを証明していませんが、それを見て怒って、断固として落とします.
待って、私はプロジェクトの中でFastJsonを使って、RestTemplateのmessageConvertersの中でFastJsonがなくて、1人の乙女座のプログラマーとして、どうしてあなたがjacksonで私のFastJsonを解析することを許すことができて、断固としてjacksonをやめて、FastJsonに参加して、コードは以下の通りです:
RestTemplate restTemplate =new RestTemplate();
restTemplate.getMessageConverters().clear();
restTemplate.getMessageConverters().add(new FastJsonHttpMessageConverter());

すべてのmessageConvertersを乾かし、FastJsonHttpMessageConverterに加入する.FastJsonHttpMessageConverterのデフォルト文字セットがUTF 8であるため、1行のコードは中国語の文字化けしとjsonをxmlに解析する問題を一緒に解決した.効果は以下の通りである.
 
RestTemplate踩坑笔记-中文乱码与json被解析成xml_第2张图片
完璧