最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決使用@ResponseBody后返回500錯(cuò)誤的問(wèn)題

 更新時(shí)間:2020年09月15日 08:48:50   作者:斗者_(dá)2013  
這篇文章主要介紹了解決使用@ResponseBody后返回500錯(cuò)誤的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

在springmvc+mybatis的項(xiàng)目中,利用mybatis分頁(yè)插件mybatis-paginator進(jìn)行分頁(yè)查詢(xún),結(jié)果出現(xiàn)了500異常,后端又沒(méi)有明顯的報(bào)錯(cuò)。

原來(lái)的寫(xiě)法,返回Map對(duì)象,由springmvc里面的機(jī)制轉(zhuǎn)為json對(duì)象,這樣就會(huì)導(dǎo)致,在轉(zhuǎn)json過(guò)程中的報(bào)錯(cuò),都隱藏了,無(wú)法拋出,前端獲取不到正確的數(shù)據(jù),

最后就出現(xiàn)了500的異常。

 @RequestMapping(value = "/query")
 @ResponseBody
 public Map<String, Object> data(HttpServletRequest request, HttpServletResponse response, CreditloanInfoParams params) {
 Map<String, Object> data = new HashMap<String, Object>();
 if(params==null){
 params=new CreditloanInfoParams();
 }
 PageList<CreditloanInfo> list = (PageList<CreditloanInfo>) creditloanInfoService.getCreditloanInfoListData(params);
 data.put("total", list.getPaginator().getTotalCount());
 data.put("rows", list);
 return data;
 }

改成使用fastJson主動(dòng)轉(zhuǎn)化為json格式的字符串,這樣的好處是,轉(zhuǎn)json過(guò)程中如果出現(xiàn)錯(cuò)誤,會(huì)有很明確的提示。

 @SuppressWarnings("unchecked")
 @RequestMapping(value = "/query")
 @ResponseBody
 public String data(HttpServletRequest request, HttpServletResponse response, BlackParams params) {
 //Map<String, Object> data = new HashMap<String, Object>();
 /*PageList<Blacklist> blackDatas = (PageList<Blacklist>) blackService.getPageData(params);
 data.put("total", blackDatas.getPaginator().getTotalCount());
 data.put("rows", blackDatas);*/
 //blackService.getPageData(params);
/* Map data = new HashMap();
 PageList<Blacklist> blackDatas = blackService.getBlackListData(params);
 data.put("total", blackDatas.getPaginator().getTotalCount());
 data.put("rows", blackDatas);*/
 return JSON.toJSONString(blackService.getPageData(params));
 }

最后發(fā)現(xiàn)是轉(zhuǎn)json中出現(xiàn)了空指針異常。修復(fù)后,問(wèn)題解決。

補(bǔ)充知識(shí):springboot 使用過(guò)濾器獲取response內(nèi)容保存接口訪問(wèn)日志

一、創(chuàng)建過(guò)濾器

1. 在spring boot的啟動(dòng)入口出添加注解 @ServletComponentScan

@SpringBootApplication 
@ServletComponentScan
public class Application {
 public static void main(String[] args) {
  SpringApplication.run(Applicatioin.class, args);
 }
}

2.新建過(guò)濾器AccessLogFilter.java

@WebFilter(filterName = "accessLog", urlPatterns = "/api/*")
public class AccessLogFilter implements Filter {
 
 @Autowired
 AccessLogMapper accessLogMapper; 
 public void destroy() { 
 } 
 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
 long startTime = System.currentTimeMillis();
 ResponseWrapper wrapper = new ResponseWrapper((HttpServletResponse) response);
 HttpServletRequest req = (HttpServletRequest) request;
 
 chain.doFilter(request, wrapper);
 long endTime = System.currentTimeMillis();
 Gson gson = new Gson();
 // 獲取response返回的內(nèi)容并重新寫(xiě)入response
 
 String result = wrapper.getResponseData(response.getCharacterEncoding());
 response.getOutputStream().write(result.getBytes());   
 String uri = req.getRequestURI();
 AccessLog log = new AccessLog(); 
 log.setMethod(req.getMethod());
 log.setUrl(uri);
 log.setParameters(gson.toJson(req.getParameterMap()));
 log.setResponseCode(String.valueOf(wrapper.getStatus()));
 log.setResult(result);
 log.setCreateDatetime(new Date());
 log.setTimeConsuming((int)(endTime - startTime));
 accessLogMapper.insertSelective(log);
 } 
 public void init(FilterConfig fConfig) throws ServletException { 
 } 
}

這個(gè)過(guò)濾器使用了注解@WebFilter(filterName = "accessLog", urlPatterns = "/api/*") 進(jìn)行配置,指定了url進(jìn)入規(guī)則,只有以/api/開(kāi)頭的url才能進(jìn)入到此過(guò)濾器中。在doFilter方法中使用了自定義的ResponseWrapper對(duì)response進(jìn)行封裝。Controller接口走完之后獲取到接口返回的數(shù)據(jù)并再次封裝到response。

3. ResponseWrapper.java 類(lèi)

import java.io.ByteArrayOutputStream;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
 
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper; 
public class ResponseWrapper extends HttpServletResponseWrapper { 
 private ByteArrayOutputStream buffer = null; 
 private ServletOutputStream out = null; 
 private PrintWriter writer = null; 
 
 public ResponseWrapper(HttpServletResponse response) throws IOException{
 super(response);
  
  buffer = new ByteArrayOutputStream();
  out = new WapperedOutputStream(buffer);
  writer = new PrintWriter(new OutputStreamWriter(buffer, "UTF-8"));
 }
 
 //重載父類(lèi)獲取outputstream的方法
 @Override
 public ServletOutputStream getOutputStream() throws IOException {
  return out;
 }
 
 @Override
 public PrintWriter getWriter() throws IOException {
  return writer;
 }
 
 @Override
 public void flushBuffer() throws IOException {
  if (out != null) {
   out.flush();
  }
  if (writer != null) {
   writer.flush();
  }
 }
 
 @Override
 public void reset() {
  buffer.reset();
 }
 
 public String getResponseData(String charset) throws IOException {
  flushBuffer();//將out、writer中的數(shù)據(jù)強(qiáng)制輸出到WapperedResponse的buffer里面,否則取不到數(shù)據(jù)
  byte[] bytes = buffer.toByteArray(); 
  try {
   return new String(bytes, "UTF-8");
  } catch (UnsupportedEncodingException e) {
   return "";
  } 
 } 
 
 //內(nèi)部類(lèi),對(duì)ServletOutputStream進(jìn)行包裝,指定輸出流的輸出端
 
 private class WapperedOutputStream extends ServletOutputStream { 
  private ByteArrayOutputStream bos = null; 
  public WapperedOutputStream(ByteArrayOutputStream stream) throws IOException {
   bos = stream;
  }
 
  //將指定字節(jié)寫(xiě)入輸出流bos
  @Override
  public void write(int b) throws IOException {
   bos.write(b);
  }
 
 @Override
 public boolean isReady() {
 // TODO Auto-generated method stub
 return false;
 }
 
 @Override
 public void setWriteListener(WriteListener listener) {
 // TODO Auto-generated method stub
 
 }
 } 
}

以上這篇解決使用@ResponseBody后返回500錯(cuò)誤的問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 關(guān)于Java的Condition接口最佳理解方式

    關(guān)于Java的Condition接口最佳理解方式

    這篇文章主要介紹了關(guān)于Java的Condition接口最佳理解方式,Condition就是實(shí)現(xiàn)了管程里面的條件變量,Java?語(yǔ)言?xún)?nèi)置的管程里只有一個(gè)條件變量,而Lock&Condition實(shí)現(xiàn)的管程支持多個(gè)條件變量,需要的朋友可以參考下
    2023-05-05
  • JAVA集合框架專(zhuān)題

    JAVA集合框架專(zhuān)題

    這篇文章主要介紹了JAVA集合框架的相關(guān)知識(shí),文中講解非常細(xì)致,幫助大家更好的理解學(xué)習(xí)JAVA框架,感興趣的朋友快來(lái)了解下
    2020-06-06
  • Java利用StringBuffer替換特殊字符的方法實(shí)現(xiàn)

    Java利用StringBuffer替換特殊字符的方法實(shí)現(xiàn)

    這篇文章主要介紹了Java利用StringBuffer替換特殊字符的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java中的線程私有變量ThreadLocal詳解

    Java中的線程私有變量ThreadLocal詳解

    這篇文章主要介紹了Java中的線程私有變量ThreadLocal詳解,ThreadLoalMap是ThreadLocal中的一個(gè)靜態(tài)內(nèi)部類(lèi),類(lèi)似HashMap的數(shù)據(jù)結(jié)構(gòu),但并沒(méi)有實(shí)現(xiàn)Map接口,需要的朋友可以參考下
    2023-08-08
  • SpringBoot中忽略實(shí)體類(lèi)中的某個(gè)屬性不返回給前端的方法(示例詳解)

    SpringBoot中忽略實(shí)體類(lèi)中的某個(gè)屬性不返回給前端的方法(示例詳解)

    本文介紹了在Spring Boot中使用Jackson和Fastjson忽略實(shí)體類(lèi)屬性不返回給前端的方法,在Jackson中,同時(shí)使用@JsonProperty和@JsonIgnore時(shí),@JsonIgnore可能失效,Fastjson中可以使用@JSONField(serialize=false)來(lái)實(shí)現(xiàn),本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友參考下吧
    2024-11-11
  • Java實(shí)現(xiàn)兩人五子棋游戲(三) 畫(huà)出棋子

    Java實(shí)現(xiàn)兩人五子棋游戲(三) 畫(huà)出棋子

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)兩人五子棋游戲,畫(huà)出五子棋的棋子,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 淺談一下Spring中的createBean

    淺談一下Spring中的createBean

    createBean是創(chuàng)建Bean的主要方法, 該方法位于:AbstractBeanFactory的doGetBean方法中的createBean調(diào)用。本文就來(lái)淺談一下Spring中的createBean?,感興趣的可以了解一下
    2022-07-07
  • Spring MVC數(shù)據(jù)綁定概述及原理詳解

    Spring MVC數(shù)據(jù)綁定概述及原理詳解

    這篇文章主要介紹了Spring MVC數(shù)據(jù)綁定概述及原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 利用java操作Excel文件的方法

    利用java操作Excel文件的方法

    以下是對(duì)利用java操作Excel文件的方法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-09-09
  • idea2020.2卡死在reading maven projects

    idea2020.2卡死在reading maven projects

    這篇文章主要介紹了idea2020.2卡死在reading maven projects,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09

最新評(píng)論

峡江县| 荣成市| 泰顺县| 抚宁县| 抚远县| 新野县| 大新县| 微博| 临澧县| 左贡县| 武鸣县| 紫云| 麦盖提县| 从化市| 六盘水市| 阳泉市| 襄汾县| 嵊州市| 无极县| 宝清县| 剑阁县| 诸城市| 桦川县| 固始县| 深泽县| 靖江市| 拜城县| 鸡西市| 剑阁县| 布尔津县| 驻马店市| 双鸭山市| 和硕县| 壶关县| 潮安县| 寿阳县| 丽水市| 东兴市| 澳门| 泰宁县| 闵行区|