RestTemplate 401 获取错误信息的处理方案
时间:2021-12-22 10:23:51|栏目:JAVA代码|点击: 次
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
@Generated
public 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
@NoArgsConstructor
public 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
上一篇:使用SpringCloudApiGateway之支持Cors跨域请求
栏 目:JAVA代码
下一篇:完美解决IDEA Ctrl+Shift+f快捷键突然无效的问题
本文标题:RestTemplate 401 获取错误信息的处理方案
本文地址:http://www.codeinn.net/misctech/187759.html


阅读排行
- 1Java Swing组件BoxLayout布局用法示例
- 2java中-jar 与nohup的对比
- 3Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 4Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 5Java中自定义异常详解及实例代码
- 6深入理解Java中的克隆
- 7java读取excel文件的两种方法
- 8解析SpringSecurity+JWT认证流程实现
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机




