RestTemplate 401 获取错误信息的处理方案

网友投稿 1403 2022-12-17

RestTemplate 401 获取错误信息的处理方案

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

@Generated

public class C {

@Id

@GeneratedValue

private Integer id;

@Column(name = "diseaseName",length = 255tSSLWt,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 entity = new HttpEntity<>(json, headers);

http:// String url = "http://localhost:3001/c";

ResponseEntity 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 entity = new HttpEntity<>(json, headers);

String url = "http://localhost:3001/c/";

ResponseEntity responseEntity = restTemplate.postForEntity(url,entity,C.class);

return new ResponseData(ExceptionMsg.SUCCESS,responseEntity);

}

返回成功

解决办法二:添加注解

@Data

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:解决RestTemplate加@Autowired注入不了的问题
下一篇:解决RestTemplate 请求接收自定义400+ 或500+错误
相关文章

 发表评论

暂时没有评论,来抢沙发吧~