欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決使用@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è)查詢,結(jié)果出現(xiàn)了500異常,后端又沒(méi)有明顯的報(bào)錯(cuò)。

原來(lái)的寫法,返回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)容并重新寫入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/開頭的url才能進(jìn)入到此過(guò)濾器中。在doFilter方法中使用了自定義的ResponseWrapper對(duì)response進(jìn)行封裝。Controller接口走完之后獲取到接口返回的數(shù)據(jù)并再次封裝到response。

3. ResponseWrapper.java 類

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"));
 }
 
 //重載父類獲取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)部類,對(duì)ServletOutputStream進(jìn)行包裝,指定輸出流的輸出端
 
 private class WapperedOutputStream extends ServletOutputStream { 
  private ByteArrayOutputStream bos = null; 
  public WapperedOutputStream(ByteArrayOutputStream stream) throws IOException {
   bos = stream;
  }
 
  //將指定字節(jié)寫入輸出流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)文章

  • Java實(shí)現(xiàn)分解任意輸入數(shù)的質(zhì)因數(shù)算法示例

    Java實(shí)現(xiàn)分解任意輸入數(shù)的質(zhì)因數(shù)算法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)分解任意輸入數(shù)的質(zhì)因數(shù)算法,涉及java數(shù)學(xué)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • IDEA未配置SQL方言:無(wú)法使用SQL提示解決方法

    IDEA未配置SQL方言:無(wú)法使用SQL提示解決方法

    在使用IDEA進(jìn)行SQL開發(fā)時(shí),如果未配置SQL方言可能會(huì)導(dǎo)致一些問(wèn)題,如無(wú)法正確識(shí)別數(shù)據(jù)庫(kù)中的關(guān)鍵字、數(shù)據(jù)類型等,這篇文章主要給大家介紹了關(guān)于IDEA未配置SQL方言,無(wú)法使用SQL提示解決方法的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • MyBatis-Plus 通用IService使用詳解

    MyBatis-Plus 通用IService使用詳解

    這篇文章主要介紹了MyBatis-Plus 通用IService使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • springboot整合gateway實(shí)現(xiàn)網(wǎng)關(guān)功能的示例代碼

    springboot整合gateway實(shí)現(xiàn)網(wǎng)關(guān)功能的示例代碼

    本文主要介紹了springboot整合gateway實(shí)現(xiàn)網(wǎng)關(guān)功能的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java中Thread類的使用和它的屬性

    Java中Thread類的使用和它的屬性

    在java中可以進(jìn)行多線程編程,在java標(biāo)準(zhǔn)庫(kù)中提供了一個(gè)Thread類,來(lái)表示線程操作,本文主要介紹了Java中Thread類的使用和它的屬性,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Spring容器添加組件方式實(shí)現(xiàn)

    Spring容器添加組件方式實(shí)現(xiàn)

    這篇文章主要介紹了Spring容器添加組件方式實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • RabbitMQ交換機(jī)使用場(chǎng)景和消息可靠性總結(jié)分析

    RabbitMQ交換機(jī)使用場(chǎng)景和消息可靠性總結(jié)分析

    這篇文章主要為大家介紹了RabbitMQ交換機(jī)使用場(chǎng)景和消息可靠性總結(jié)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 在Mac OS上安裝Tomcat服務(wù)器的教程

    在Mac OS上安裝Tomcat服務(wù)器的教程

    這篇文章主要介紹了在Mac OS上安裝Tomcat服務(wù)器的教程,方便進(jìn)行工作環(huán)境下的Java web開發(fā),需要的朋友可以參考下
    2015-11-11
  • Java檢測(cè)線程中斷狀態(tài)的方法示例

    Java檢測(cè)線程中斷狀態(tài)的方法示例

    這篇文章主要介紹了Java檢測(cè)線程中斷狀態(tài)的方法,結(jié)合實(shí)例形式分析了java針對(duì)線程中斷狀態(tài)檢測(cè)的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-10-10
  • Java--SSH,SSM和Spring?Boot框架區(qū)別及優(yōu)缺點(diǎn)說(shuō)明

    Java--SSH,SSM和Spring?Boot框架區(qū)別及優(yōu)缺點(diǎn)說(shuō)明

    這篇文章主要介紹了Java--SSH,SSM和Spring?Boot框架區(qū)別及優(yōu)缺點(diǎn)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評(píng)論