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 = {\"a\"})@Setter@Generatedpublic class C { @Id @GeneratedValue private 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(value = \"\",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<String> entity = new HttpEntity<>(json, headers); String url = \"http://localhost:3001/c\"; ResponseEntity<Commondisease> responseEntity = restTemplate.postForEntity(url, entity, C.class); return new ResponseData(ExceptionMsg.SUCCESS, responseEntity); }
返回结果截图:
返回结果为空的讨论:返回的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(value = \"\",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<String> entity = new HttpEntity<>(json, headers); String url = \"http://localhost:3001/c/\"; ResponseEntity<Commondisease> responseEntity = restTemplate.postForEntity(url,entity,C.class); return new ResponseData(ExceptionMsg.SUCCESS,responseEntity);}
返回成功
解决办法二:添加注解
@Data
以上为个人经验,希望能给大家一个参考,也希望大家多多支持趣讯吧。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/15310.html