国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - Spring MVC打印@RequestBody、@Response日志的方法

Spring MVC打印@RequestBody、@Response日志的方法

2021-07-14 15:29天啦擼 Java教程

這篇文章主要介紹了Spring MVC打印@RequestBody、@Response日志的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

問(wèn)題描述:

使用json接收前端參數(shù)時(shí), springmvc默認(rèn)輸出日志如下:

o.s.web.servlet.dispatcherservlet : post "/example_project/app/login", parameters={}
parameters={}無(wú)法打印出json消息內(nèi)容。

如果自己實(shí)現(xiàn)參數(shù)打印, 則需要從reqeust.getinputstream中獲取json內(nèi)容, 但是由于流只能讀取一次, 所以會(huì)導(dǎo)致后續(xù)springmvc解析參數(shù)異常。

網(wǎng)上找到一種比較解決方法: 用httprequestwrapper重新封裝reqeust, 使打印日志后springmvc能正常解析httpreqeust。這種方法比較麻煩, 這里不去研究

這里主要說(shuō)說(shuō)spring提供的較好的解決方案:

可以通過(guò)自定義requestbodyadvisor、responsebodyadvisor來(lái)實(shí)現(xiàn)日志輸出。

  • requestbodyadvisor可以獲取到解析后的controller方法參數(shù)對(duì)象。
  • responsebodyadvisor可以獲取到controller方法返回值對(duì)象。

然后將他們注冊(cè)到requestmappinghandleradapter:

?
1
2
3
4
5
6
7
8
9
// 繼承webmvcconfigurationsupport, 重寫該方法
@override
@bean
public requestmappinghandleradapter requestmappinghandleradapter() {
  requestmappinghandleradapter adapter = super.requestmappinghandleradapter();
  adapter.setrequestbodyadvice(lists.newarraylist(new customerrequestbodyadvisor()));
  adapter.setresponsebodyadvice(lists.newarraylist(new customerresponsebodyadvisor()));
  return adapter;
}

另附customerrequestbodyadvisor、customerresponsebodyadvisor日志輸出實(shí)現(xiàn)參考:

requestbodyadvisor實(shí)現(xiàn)參考:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// customerrequestbodyadvisor.java
/**
* 打印請(qǐng)求參數(shù)日志
*/
public class customerrequestbodyadvisor extends requestbodyadviceadapter {
 
  private static final logger logger = loggerfactory.getlogger(customerrequestbodyadvisor.class);
 
  @override
  public boolean supports(methodparameter methodparameter, type targettype, class<? extends httpmessageconverter<?>> convertertype) {
    // 只處理@requestbody注解了的參數(shù)
    return methodparameter.getparameterannotation(requestbody.class) != null;
  }
 
  @override
  public object afterbodyread(object body, httpinputmessage inputmessage, methodparameter parameter, type targettype, class<? extends httpmessageconverter<?>> convertertype) {
    method method = parameter.getmethod();
    
    // 參數(shù)對(duì)象轉(zhuǎn)json字符串
    string jsonbody;
    if (stringhttpmessageconverter.class.isassignablefrom(convertertype)) {
      jsonbody = body.tostring();
    } else {
      jsonbody = json.tojsonstring(body, serializerfeature.usesinglequotes);
    }
    
    // 自定義日志輸出
    if (logger.isinfoenabled()) {
      logger.info("{}#{}: {}", parameter.getcontainingclass().getsimplename(), method.getname(), jsonbody);
      //      logger.info("json request<=========method:{}#{}", parameter.getcontainingclass().getsimplename(), method.getname());
    }
    return super.afterbodyread(body, inputmessage, parameter, targettype, convertertype);
  }
}

responsebodyadvisor實(shí)現(xiàn)參考:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// customerresponsebodyadvisor.java
/**
* 打印響應(yīng)值日志
*/
public class customerresponsebodyadvisor implements responsebodyadvice<object> {
  private static final logger logger = loggerfactory.getlogger(customerresponsebodyadvisor.class);
 
  @override
  public boolean supports(methodparameter returntype, class<? extends httpmessageconverter<?>> convertertype) {
    return abstractjackson2httpmessageconverter.class.isassignablefrom(convertertype)
        || returntype.getmethod().isannotationpresent(responsebody.class);
  }
 
  @override
  public object beforebodywrite(object body, methodparameter returntype, mediatype selectedcontenttype, class<? extends httpmessageconverter<?>> selectedconvertertype, serverhttprequest request, serverhttpresponse response) {
    // 響應(yīng)值轉(zhuǎn)json串輸出到日志系統(tǒng)
    if (logger.isinfoenabled()) {
      logger.info("{}: {}", request.geturi(), json.tojsonstring(body, serializerfeature.usesinglequotes));
    }
    return body;
  }
 
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://segmentfault.com/a/1190000018085100

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 天堂精品久久 | 久久久久久久久久久久久久免费看 | 99精品国产高清在线观看 | 成人在线观看免费视频 | 自拍偷拍 国产 | 日韩一区二区免费视频 | 成人精品免费视频 | 综合伊人久久 | 99精品一区二区三区 | 亚洲国产99 | 综合久久综合久久 | 欧美成人a∨高清免费观看 国产99久久 | 亚洲综合国产 | 在线一区观看 | 日日久 | 日韩三级网址 | 3344视频 | 久久久在线 | 成人网在线观看 | 日韩在线二区 | 黄色影片免费在线观看 | 国产精品第一国产精品 | 伊人91| 欧美精品日韩 | 欧美在线免费视频 | 日本少妇bbbb爽爽bbb美 | 91视频免费在线看 | 久久久影视 | 国产成人精品久久二区二区91 | 黄桃av | 日韩成人在线播放 | 在线日韩一区二区 | 91久久精品国产 | 欧美在线小视频 | 精品亚洲第一 | 国产精品久久久久久久久久久久久久 | 亚洲成人av | 黄色片免费在线观看 | 久久精品国产清自在天天线 | 免费一区 | 日韩国产一区二区三区 |