RestTemplate|RestTemplate 401 获取错误信息的处理方案
目录
- RestTemplate 401错误
- 异常处理
- 判断是否异常
- RestTemplate通过对象传参,response的body为空讨论
- 代码复现
- 解决办法一:实体类转成普通类
- 解决办法二:添加注解
RestTemplate 401错误 调用第三方api 若是服务返回状态码不为200,默认会执行DefaultResponseErrorHandler
异常处理
@Override public void handleError(ClientHttpResponse response) throws IOException {HttpStatus statusCode = getHttpStatusCode(response); switch (statusCode.series()) {case CLIENT_ERROR:throw new HttpClientErrorException(statusCode, response.getStatusText(),response.getHeaders(), getResponseBody(response), getCharset(response)); case SERVER_ERROR:throw new HttpServerErrorException(statusCode, response.getStatusText(),response.getHeaders(), getResponseBody(response), getCharset(response)); default:throw new RestClientException("Unknown status code [" + statusCode + "]"); } }
判断是否异常
protected boolean hasError(HttpStatus statusCode) {return (statusCode.series() == HttpStatus.Series.CLIENT_ERROR ||statusCode.series() == HttpStatus.Series.SERVER_ERROR); }
通常会直接已异常形势抛出,若不特殊处理无法获取返回提示信息。
需要捕捉HttpClientErrorException 异常,则可获取返回信息
try{......}catch (HttpClientErrorException e) {String resBody = e.getResponseBodyAsString(); log.info("客户端异常返回:{}", resBody); return new ResponseEntity<>(JSON.parseObject(resBody, res), e.getStatusCode()); }
一开始我这样写,死活返回的都是null
原来跟我设置的requestFactory有关
采用SimpleClientHttpRequestFactory 无法获取提示
需要换成 HttpComponentsClientHttpRequestFactory
RestTemplate通过对象传参,response的body为空讨论
代码复现
实体类
@Entity@Table(name = "a",schema = "a")@JsonIgnoreProperties(value = https://www.it610.com/article/{"a"})@Setter@Generatedpublic class C {@Id@GeneratedValueprivate Integer id; @Column(name = "diseaseName",length = 255,nullable = false,unique = true)private String diseaseName; @Column(name = "description",length = 255,nullable = false,unique = true)private String description; @Column(name = "department",length = 255,nullable = false,unique = true)private String department; }controller@ResponseBody@RequestMapping(valuehttps://www.it610.com/article/= "",method = RequestMethod.POST)public Response APIcreate(@RequestBody C c) {String json = JSONUtil.toJSONString(c); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON_UTF8); HttpEntity entity = new HttpEntity<>(json, headers); String url = "http://localhost:3001/c"; ResponseEntityresponseEntity = restTemplate.postForEntity(url, entity, C.class); return new ResponseData(ExceptionMsg.SUCCESS, responseEntity); }
返回结果截图:
![RestTemplate|RestTemplate 401 获取错误信息的处理方案](https://img.it610.com/image/info11/c1d7942cbfbf477fa3669ec3a6ba82f1.jpg)
文章图片
返回结果为空的讨论:返回的C类是jpa封装后的类,即使通过json工具,也无法转换成功
解决办法一:实体类转成普通类
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data@AllArgsConstructor@NoArgsConstructorpublic class C { private Integer id; private String diseaseName; private String description; private String department; } @ResponseBody@RequestMapping(valuehttps://www.it610.com/article/= "",method = RequestMethod.POST)public Response APIcreate(@RequestBody C c) {//C c = new Commondisease(1,"zhangsan","11","2222"); String json = JSONUtil.toJSONString(c); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON_UTF8); HttpEntity entity = new HttpEntity<>(json, headers); String url = "http://localhost:3001/c/"; ResponseEntityresponseEntity =restTemplate.postForEntity(url,entity,C.class); return new ResponseData(ExceptionMsg.SUCCESS,responseEntity); }
返回成功
解决办法二:添加注解
@Data
【RestTemplate|RestTemplate 401 获取错误信息的处理方案】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- EditText默认不获取焦点弹出键盘
- whlie循环和for循环的应用
- 【实用教程】4种获取无水印视频素材的方法
- 插件化无法获取或找到.so文件
- 获取知识的门槛
- 《原则》读书笔记
- 提取ipa|提取ipa 包内资源
- SpringBoot|SpringBoot 属性配置中获取值的方式
- django|django 获取用户的域名
- [mysql获取当天|[mysql获取当天,昨天,本周,本月,上周,上月的起始时间]