女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

主動(dòng)寫(xiě)入流對(duì)@ResponseBody注解的影響

京東云 ? 來(lái)源:京東零售 柯賢銘 ? 作者:京東零售 柯賢銘 ? 2024-10-29 11:28 ? 次閱讀

作者:京東零售 柯賢銘

問(wèn)題回溯

2023年Q2某日運(yùn)營(yíng)反饋一個(gè)問(wèn)題,商品系統(tǒng)商家中心某批量工具模板無(wú)法下載,導(dǎo)致功能無(wú)法使用(因?yàn)槟0迨莿?dòng)態(tài)變化的)

商家中心報(bào)錯(cuò)(JSON串):

{"code":-1,"msg":"失敗"}

?

負(fù)責(zé)的同事看到失敗后立即與我展開(kāi)討論(因?yàn)椴皇顷P(guān)鍵業(yè)務(wù),所以不需要回滾,修復(fù)即可),我們發(fā)現(xiàn)新功能模板下載的代碼與之前的代碼有所不同,恰好之前的功能又可以正常運(yùn)行,所以同事對(duì)現(xiàn)有代碼進(jìn)行改造然后預(yù)發(fā)布測(cè)試完成后再次上線。

?

其他業(yè)務(wù)代碼:

/**
 * 模板下載
 */
@RequestMapping("/doBatchWareSetAd")
public void doBatchWareSetAd(@RequestParam MultipartFile file, HttpServletResponse response) {
	wareBatchBusiness.doBatchWareSetAd(file, response, getLongOrgCode(), getCurrentUserPin(), getCurrentUserId());
}

?

問(wèn)題業(yè)務(wù)代碼:

/**
 * 模板下載
 */
@RequestMapping("/doBatchWareSetAdDemo")
@ResponseBody
public Map doBatchWareSetAd(@RequestParam MultipartFile file, HttpServletResponse response) {
	return wareBatchBusiness.doBatchWareSetAd(file, response, getLongOrgCode(), getCurrentUserPin(), getCurrentUserId());
}

?

上線的結(jié)果是;仍然無(wú)法使用。

其實(shí)也正常:因?yàn)閮煞N代碼在預(yù)發(fā)布都可以正常運(yùn)行,在線上出錯(cuò)只可能是因?yàn)槠渌颍徊贿^(guò)我們不了解底層原理,害怕它 "可能" 有問(wèn)題罷了,最終查詢得到的結(jié)論是權(quán)限系統(tǒng)管理員在線上環(huán)境沒(méi)有給我們配置相應(yīng)的文件,導(dǎo)致請(qǐng)求為空,導(dǎo)致請(qǐng)求失敗。

?

探索 @ResponseBody 與主動(dòng)寫(xiě)入流的關(guān)系

我們都知道 @ResponseBody 注解可以幫助我們把返回對(duì)象轉(zhuǎn)化為JSON,方便展示和交互。

那它到底是如何工作的呢,請(qǐng)看下面的講解:

?

代碼案例1:

@RequestMapping("/test1")
@ResponseBody
public Map test1(HttpServletResponse response) {
    Map map = new HashMap();
    map.put("1", "1");
    return map;
}

// 響應(yīng)
JSON報(bào)文

?

跟代碼發(fā)現(xiàn)其核心處理類為:RequestResponseBodyMethodProcessor.java

方法:org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor#handleReturnValue 會(huì)處理其相關(guān)返回值。

真正的核心處理方法:org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor#writeWithMessageConverters

關(guān)鍵DEBUG記錄如圖所示:

wKgaoWcgVl6ASzeIAACPuUuQfBA158.png

?

后續(xù)內(nèi)容可以想象,肯定還有地方去把流按照指定的HEADER寫(xiě)入,因?yàn)楹捅疚臒o(wú)關(guān)所以不深究。

?

再來(lái)看代碼案例2:

@RequestMapping("/test2")
@ResponseBody
public Map test2(HttpServletResponse response) throws IOException {
    Map map = new HashMap();
    map.put("1", "1");

    response.setContentType("application/vnd.ms-excel");
    response.setHeader("Content-Disposition", String.format(
        "attachment; filename=%s_%s.xls", "Demo", System.currentTimeMillis()));

    OutputStream out = response.getOutputStream();
    out.flush();
    out.close();
    return map;
}

// 響應(yīng)
提示下載文件

?

關(guān)鍵DEBUG源碼截圖:

wKgZoWcgVl-AEfpSAAA2pk7ToUA050.png

wKgaoWcgVmCADqguAAAlKaZXGoY120.png

?

可以發(fā)現(xiàn)Spring對(duì)這種方式操作文件流視作異常情況,然后拋出,在后續(xù)邏輯中完成整個(gè)請(qǐng)求,簡(jiǎn)單來(lái)說(shuō)就是 @ResponseBody 注解沒(méi)起到任何作用。

因此答案呼之欲出:當(dāng)時(shí)功能不可用的罪魁禍?zhǔn)拙褪窍嚓P(guān)人員沒(méi)有配置參數(shù)導(dǎo)致,與寫(xiě)法沒(méi)有任何關(guān)系。

?

結(jié)論與啟發(fā)

結(jié)論:

1.我們要相信自己的代碼,至少是要相信已經(jīng)經(jīng)過(guò)測(cè)試的代碼。

2.在委托他人或者自己配置環(huán)境參數(shù),如權(quán)限、ZK等每次都保證預(yù)發(fā)布和線上同時(shí)配置,避免遺漏的情況。

?

啟發(fā):

聊了這么多,那我們這種類似場(chǎng)景的代碼應(yīng)該怎么寫(xiě)?

既然主動(dòng)寫(xiě)入流會(huì)解除@ResponseBody的作用,反之又能發(fā)揮它的作用,那我們最佳方案是不是如下所示?

@RequestMapping("/test1")
@ResponseBody
public Map test1(HttpServletResponse response) {
    Map map = new HashMap();
    if (獲取不到文件配置 == true) {
        return map.put("msg", "獲取不到文件配置");
    }
    
    response.setContentType("application/vnd.ms-excel");
    response.setHeader("Content-Disposition", String.format(
        "attachment; filename=%s_%s.xls", "Demo", System.currentTimeMillis()));

    OutputStream out = response.getOutputStream();
    out.flush();
    out.close();
    return map;
}

?

如此一來(lái),當(dāng)發(fā)生預(yù)期之外的情況,我們有非常明顯的報(bào)錯(cuò)提示,當(dāng)正常時(shí)又可以完美實(shí)現(xiàn)功能,妙哉(我覺(jué)得)~

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4886

    瀏覽量

    70216
  • JSON
    +關(guān)注

    關(guān)注

    0

    文章

    121

    瀏覽量

    7256
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何通過(guò)注解來(lái)優(yōu)化我們的Java代碼

    Java注解可以說(shuō)是我們編碼過(guò)程中最常用的。本篇文章將給大家介紹Java注解的概念、作用以及如何使用注解來(lái)提升代碼的可讀性和靈活性,并介紹如何通過(guò)注解來(lái)優(yōu)化我們的Java代碼。 1、什
    的頭像 發(fā)表于 09-30 11:39 ?867次閱讀

    機(jī)種新品導(dǎo)入流

    機(jī)種新品導(dǎo)入流
    發(fā)表于 08-11 10:08

    redis緩存注解怎么使用

    spring boot —— redis 緩存注解使用教程
    發(fā)表于 09-11 14:43

    HarmonyOS注解的使用方法分享

    javax.annotation.processing.Processor 文件寫(xiě)入注解處理器的全稱,包括包路徑4、使用注解在entry模塊的build.gradle文件中添加依賴dependencies
    發(fā)表于 03-28 14:04

    分析java注解基本概念

    什么是注解(Annotation): Annotation(注解)就是Java提供了一種元程序中的元素關(guān)聯(lián)任何信息和著任何元數(shù)據(jù)(metadata)的途徑和方法。Annotion(注解)是一個(gè)接口
    發(fā)表于 09-27 14:53 ?0次下載

    注解定義Bean及開(kāi)發(fā)

    注解本質(zhì)是一個(gè)繼承了Annotation 的特殊接口,其具體實(shí)現(xiàn)類是Java 運(yùn)行時(shí)生成的動(dòng)態(tài)代理類。
    發(fā)表于 08-02 10:26 ?533次閱讀

    Spring Web MVC注解

    RequestMapping注解的主要用途是將Web請(qǐng)求與請(qǐng)求處理類中的方法進(jìn)行映射。Spring MVC和Spring WebFlux都通過(guò)`RquestMappingHandlerMapping`和`RequestMappingHndlerAdapter`兩個(gè)類來(lái)提供對(duì)@RequestMapping
    的頭像 發(fā)表于 04-07 11:32 ?776次閱讀
    Spring Web MVC<b class='flag-5'>注解</b>

    Spring Dependency Inject與Bean Scops注解

    DependsOn`注解可以配置Spring IoC容器在初始化一個(gè)Bean之前,先初始化其他的Bean對(duì)象。下面是此注解使用示例代碼:
    的頭像 發(fā)表于 04-07 11:35 ?847次閱讀
    Spring Dependency Inject與Bean Scops<b class='flag-5'>注解</b>

    容器配置及Spring Boot注解

    Autowired注解用于標(biāo)記Spring將要解析和注入的依賴項(xiàng)。此注解可以作用在構(gòu)造函數(shù)、字段和setter方法上。
    的頭像 發(fā)表于 04-07 11:45 ?751次閱讀
    容器配置及Spring Boot<b class='flag-5'>注解</b>

    Springboot常用注解合集

    前幾章,在系統(tǒng)啟動(dòng)類里面,都加入了此啟動(dòng)注解,此注解是個(gè)組合注解,包括了`@SpringBootConfiguration`、`@EnableAutoConfiguration`和`@ComponentScan`
    的頭像 發(fā)表于 04-07 14:27 ?919次閱讀
    Springboot常用<b class='flag-5'>注解</b>合集

    JAVA中注解是怎么做到的(上)

    注解想必大家在項(xiàng)目中經(jīng)常使用,比如Spring框架中常用的一些注解:`@Controller`、`@Service`、`@RequestMapping`等等,它是JDK1.5及以后版本引入的一個(gè)特性
    的頭像 發(fā)表于 05-11 10:57 ?808次閱讀

    JAVA中注解是怎么做到的(下)

    注解想必大家在項(xiàng)目中經(jīng)常使用,比如Spring框架中常用的一些注解:`@Controller`、`@Service`、`@RequestMapping`等等,它是JDK1.5及以后版本引入的一個(gè)特性
    的頭像 發(fā)表于 05-11 10:57 ?714次閱讀
    JAVA中<b class='flag-5'>注解</b>是怎么做到的(下)

    springmvc常用5種注解

    SpringMVC是一種基于Java的Web框架,使用注解可以更加方便靈活地開(kāi)發(fā)和管理控制器,實(shí)現(xiàn)請(qǐng)求的映射和處理。在SpringMVC中,有許多常用的注解,本文將詳細(xì)介紹其中的五種注解,并且詳細(xì)
    的頭像 發(fā)表于 11-22 16:51 ?1191次閱讀

    springboot核心注解

    Spring Boot 是基于 Spring 框架的開(kāi)源框架,它可以幫助開(kāi)發(fā)者快速構(gòu)建、部署和運(yùn)行獨(dú)立的、生產(chǎn)級(jí)的 Spring 應(yīng)用程序。Spring Boot 提供了一系列核心注解,這些注解可以
    的頭像 發(fā)表于 11-23 09:23 ?721次閱讀

    SpringBoot核心注解由幾個(gè)注解組成

    簡(jiǎn)化應(yīng)用程序開(kāi)發(fā)的注解,其中核心注解包括 @SpringBootApplication、@RestController、@RequestMapping、@Autowired、@ComponentScan
    的頭像 發(fā)表于 12-03 15:09 ?977次閱讀