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 = 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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • RestTemplate未使用线程池问题的解决方法

    一.问题描述 现场出现springboot服务卡死,无法打开页面现象. 初步分析为服务中使用RestTemplate通信框架,但未使用连接池,如果通信抛出异常(连接失败),连续运行一定时间,导致线程飙升,资源耗尽,服务程序宕机. 二.问题再现 模拟无法通信的微服务地址,修改连接2s/次,启动三个微服务demo进行通信,连续测试2小时,现象可再现: 详细如下图: 启动时线程数: 连接异常提示: 线程飙升: 大量未关闭线程: 线程dump信息: "http-nio-8081-exec-120&quo

  • 解决RestTemplate 请求接收自定义400+ 或500+错误

    目录 RestTemplate 请求接收自定义400+ 或500+错误 场景 原因 解决办法 自定义RestTemplate的ResponseErrorHandler Spring框架中的RestTemplate处理ClientHttpResponse的方式 并不想让它抛异常 无法使用IOC注入的场景下 RestTemplate 请求接收自定义400+ 或500+错误 场景 当服务端自定义400错误返回体时,使用restTemplate 请求接收不到消息体.而我正想根据不同的错误信息做不同的操作

  • 解决RestTemplate 的getForEntity调用接口乱码的问题

    RestTemplate 的getForEntity调用接口乱码 有时候,当我们在SpringBoot项目中使用restTemplate去调用第三方接口时,会发现返回的body中出现了乱码,百度一搜,基本都说是需要将restTemplate中的消息转换器中的StringHttpMessageConverter的字符编码由iso8859-1改为utf-8 ,但是发现并不管用,那么还有一种可能是第三方接口的数据经过GZIP压缩过 默认情况下,restTemplate使用的是JDK的HTTP调用器,并

  • 解决使用RestTemplate时报错RestClientException的问题

    目录 使用RestTemplate时报错RestClientException 这是自己封装的一个发送请求的方法 这是自定义的一个http信息Converter RestTemplate的错误处理 问题描述 ErrorHandler 解决办法 使用RestTemplate时报错RestClientException 这是自己封装的一个发送请求的方法 public Map<String, Object> sendRequest(Map<String, Object> body,Str

  • SpringBoot 利用RestTemplate http测试

    目录 SpringBoot RestTemplate http测试 spring-boot有关spring-boot测试的一些问题 具体的测试方法如下 但是有个问题就是 SpringBoot RestTemplate测试Controller 1.功能测试类 2.工具类 SpringBoot RestTemplate http测试 spring-boot有关spring-boot测试的一些问题 这测试的时候主程序没有启动报错.错误如下 ==org.springframework.web.clien

  • SpringBoot-RestTemplate如何实现调用第三方API

    目录 1.在build.grdle加入依赖 2.在config包下创建一个RestTemlateConfig 3.在model包下创建一个新的包 4.Constans类下将调用接口的AppKey值宏定义 5.在controller包下创建一个 6.用Postman调用接口,验证是否成功 1.在build.grdle加入依赖 implementation('org.springframework.boot:spring-boot-starter-web') 2.在config包下创建一个RestT

  • RestTemplate自定义ErrorHandler方式

    目录 RestTemplate自定义ErrorHandler RestTemplate实例 三个步骤: SpringBoot 中使用 RestTemplate 自定义 异常处理,捕获最原始的错误信息 RestTemplate 异常处理流程 自定义 RestTemplate 异常处理 设置 RestTemplate 的异常处理类 RestTemplate自定义ErrorHandler 当通过RestTemplate调用服务发生异常时,往往会返回400 Bad Request或500 interna

  • 解决RestTemplate加@Autowired注入不了的问题

    RestTemplate加@Autowired注入不了 1.在启动类加入 如图箭头所示代码: 然后在进行@Autowired发现不报错了. 完美解决 SpringBoot 如何注入RestTemplate 创建一个文件夹 ,我这边习惯于创建config文件夹 将下面的一段代码放到里面 import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotati

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

    目录 RestTemplate 401错误 异常处理 判断是否异常 RestTemplate通过对象传参,response的body为空讨论 代码复现 解决办法一:实体类转成普通类 解决办法二:添加注解 RestTemplate 401错误 调用第三方api 若是服务返回状态码不为200,默认会执行DefaultResponseErrorHandler 异常处理 @Override public void handleError(ClientHttpResponse response) thro

  • php获取错误信息的方法

    本文实例讲述了php获取错误信息的方法.分享给大家供大家参考.具体如下: function error_reg(){ $ar=array( E_ERROR => 'error', E_WARNING => 'warning', E_PARSE =>'prase', E_NOTICE => 'notice' ); register_shutdown_function(function() use ($ar){ $ers=error_get_last(); if($ers['type'

  • 基于spring-security 401 403错误自定义处理方案

    spring-security 401 403错误自定义处理 为了返回给前端统一的数据格式, 一般所有的数据都会以类似下面的方式返回: public class APIResultDto<T> { /** * 状态码:-1代表成功,具体参考APIErrorCode类 */ private int er; /** * 状态描述,可以自行设置或使用APIErrorCode类中默认描述 */ private String erMessage; /** * 实际返回实体,isSuccess()返回tr

  • Vue实现全局异常处理的几种方案

    目录 一.前端常见异常 二.实现简单的全局异常处理 三.Vue3 如何实现异常处理 四.总结 在开发组件库或者插件,经常会需要进行全局异常处理,从而实现:\ 全局统一处理异常: 为开发者提示错误信息: 方案降级处理等等. 那么如何实现上面功能呢?本文先简单实现一个异常处理方法,然后结合 Vue3 源码中的实现详细介绍,最后总结实现异常处理的几个核心. 本文 Vue3 版本为 3.0.11 一.前端常见异常 对于前端来说,常见的异常比较多,比如: JS 语法异常: Ajax 请求异常: 静态资源加

  • gin解析json格式的数据出错的处理方案

    写的接口给测试测试,现在还没有页面,直接测试接口.使用 c.BindJSON(&req) 总是报错,大致错误信息如下: err="invalid character '-' in numeric literal" 这是由于我的接口要求将参数按照json格式传递到后台,结果测试同事使用了form-data格式,所以才会有上面这个错误. =============补充2018-11-09 18:20:00============= 刚刚又出现了这个EOF的问题,前端确定已经按照js

  • XMLHTTPRequest的属性和方法简介

    而设计AJAX时使用的一个重要的技术(工具)就是XMLHTTPRequest对象了.这里海啸把我学习XMLHTTPRequest对象的一点资料拿出来跟大家一起分享.文中的资料都是海啸在学习时在网上收集的,如果您开过,那就再加深下印象吧!(如果您觉得侵犯了您的版权,请联系海啸.(haixiao_yao[at]yahoo.com.cn)) 1.XMLHTTPRequest对象什么是? 最通用的定义为:XmlHttp是一套可以在Javascript.VbScript.Jscript等脚本语言中通过ht

  • [转]XMLHTTPRequest的属性和方法简介

    1.XMLHTTPRequest对象什么是? 最通用的定义为:XmlHttp是一套可以在Javascript.VbScript.Jscript等脚本语言中通过http协议传送或从接收XML及其他数据的一套API.XmlHttp最大的用处是可以更新网页的部分内容而不需要刷新整个页面.(这个功能正是AJAX的一大特点之一:)) 来自MSDN的解释:XmlHttp提供客户端同http服务器通讯的协议.客户端可以通过XmlHttp对象(MSXML2.XMLHTTP.3.0)向http服务器发送请求并使用

  • ajax 入门基础之 XMLHttpRequest对象总结

    XMLHttpRequest 提供客户端同http服务器通讯的协议 一:创建 IE : http_request = new ActiveXObject("Msxml2.XMLHTTP"); http_request = new ActiveXObject("Microsoft.XMLHTTP"); 非IE: http_request = new XMLHttpRequest(); 二:onreadystatechange 指定当readyState属性改变时的事件

  • window.onerror()的用法与实例分析

    onerror语法使用 onerror 默认有三个入参: •msg: 错误信息 •url:错误所在文件 •line: 错误所在代码行,整型 window.onerror = function(msg, url, line){ // some code }; 对于 <body onerror="some code">形式的,可以通过arguments[0].arguments[1].arguments[2]依次获取参数. js中我们最常用的就是js容错 window.oner

  • AJax 学习笔记一(XMLHTTPRequest对象)

    现在很多公司都在做标准的静态页面,为了增强客户的体验效果,经常会涉及到AJax效果,而设计AJax使用的一种重要技术(工具)就是XMLHttpRequest对象了.今天学习了点关于XMLHttpRequest对象的一些方法和属性,有点体会,在这里也想记录起来. 1.何为XMLHttpRequest 定义:XMLHttp是一套可以在Javascript.VbScript.Jscript等脚本语言中通过http协议传送或从接收XML及其他数据的一套API.XmlHttp最大的用处是可以更新网页的部分

随机推荐