RestTemplate踏坑笔记-中国语の文字化けしとjsonはxmlに解析されます
4719 ワード
1.RestTemplateアクセスRestfullインタフェース:中国語文字化けし+戻りデータフォーマットxml
Spring Cloudプロジェクトは、コンポーネント間のHttp通信に必ず使用されます.springが提供する簡単で便利なテンプレートクラス:RestTemplateを使用しています.
Restfullインタフェースは次のとおりです.
要求:restTemplate.getForEntity(routerUrl,String.class,map);
200を返して、これは大丈夫で、重点は:Restfullインタフェースにアクセスして意外にもXMLフォーマットのデータを返します!!!しかも中国語は文字化けしている.
2.中国語の文字化けしを解決する
実は中国語の文字化けしの問題に対して私は予想して、restTemplateのMessageConvertersの集合の中でStringHttpMessageConverterに参加して、コードは以下の通りです:
文字化けしの問題解決
3.戻りXML問題の解決
この問題は奇妙で、私のプロジェクトには5つのコンポーネントがあり、いずれもRestfullインタフェースですが、一部のコンポーネントにアクセスすると正常なjsonが返され、一部のコンポーネントはxmlが返されます.各コンポーネントにpostmanを使用して直接アクセスし、正常なjsonを返します.では意外なことに、RestTemplateがいたずらをしているはずです.
何も言わずにソースコードをすり抜けて、怪しいやつを見つけた:jackson 2 XmlPresent
もとはRestTemplateのmessageConvertersの中でこんなに多くのメンバーが常駐していて、他の私は気にしないで、このjackson 2 XmlPresentは命を要した鬼で、私は直接証拠がなくてそれが私のjsonをXmlに変えたことを証明していませんが、それを見て怒って、断固として落とします.
待って、私はプロジェクトの中でFastJsonを使って、RestTemplateのmessageConvertersの中でFastJsonがなくて、1人の乙女座のプログラマーとして、どうしてあなたがjacksonで私のFastJsonを解析することを許すことができて、断固としてjacksonをやめて、FastJsonに参加して、コードは以下の通りです:
すべてのmessageConvertersを乾かし、FastJsonHttpMessageConverterに加入する.FastJsonHttpMessageConverterのデフォルト文字セットがUTF 8であるため、1行のコードは中国語の文字化けしとjsonを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フォーマットのデータを返します!!!しかも中国語は文字化けしている.
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に解析する問題を一緒に解決した.効果は以下の通りである.
完璧