亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

Spring 異常處理

LiveVideoStack / 2151人閱讀

摘要:異常拋出但是看一下報(bào)錯(cuò)信息,發(fā)現(xiàn)并不是我們期待的一個(gè)錯(cuò)誤的狀態(tài)碼,而是。所以,我們需要全局異常處理,層拋出異常,直接處理,返回狀態(tài)碼,而不將異常拋給控制器。異常捕獲后,修改測(cè)試,期待狀態(tài)碼為,。

控制器測(cè)試

還是上次數(shù)據(jù)不能為空的問(wèn)題,寫(xiě)到了C層測(cè)試。

先寫(xiě)一行測(cè)試代碼,先期待一個(gè)200,但是我們是知道的,因?yàn)闆](méi)有學(xué)科類(lèi)別,這肯定會(huì)拋出異常,我們就是想看看Spring捕獲這個(gè)異常之后給出的反饋是什么狀態(tài)碼。

@Test
public void saveTest() throws Exception {
    logger.debug("基礎(chǔ)測(cè)試數(shù)據(jù)準(zhǔn)備");
    MeasurementUnitCategory measurementUnitCategory = new MeasurementUnitCategory();
    String json = JSON.toJSONString(measurementUnitCategory);

    this.mockMvc.perform(post(baseUrl)
                        .header(xAuthKey, xAuthToken)
                        .contentType(MediaType.APPLICATION_JSON_UTF8)
                        .content(json))
                .andExpect(status().isOk());
}

測(cè)試一下,果然,控制臺(tái)報(bào)錯(cuò)。

異常拋出

但是看一下報(bào)錯(cuò)信息,發(fā)現(xiàn)并不是我們期待的一個(gè)錯(cuò)誤的狀態(tài)碼,而是200。同時(shí)下面還有異常拋出。

這說(shuō)明Spring為我們拋出了這個(gè)DataIntegrityViolationException異常,但是卻沒(méi)有幫我們處理,這就需要我們手動(dòng)處理然后返回給前臺(tái)狀態(tài)碼。

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = {X-Content-Type-Options=[nosniff], X-XSS-Protection=[1; mode=block], Cache-Control=[no-cache, no-store, max-age=0, must-revalidate], Pragma=[no-cache], Expires=[0], X-Application-Context=[application:-1], Content-Type=[application/json;charset=UTF-8], x-auth-token=[1b2b8d9f-3457-4277-879e-2ada48e3599e]}
     Content type = application/json;charset=UTF-8
             Body = {"id":8,"name":"","username":"usersdfdfwef23dfvdfwewef","mobile":"","pinyin":null,"createTime":1528338758059,"updateTime":1528338758059,"status":0,"department":{"id":1,"name":"內(nèi)蒙古自治區(qū)管理部門(mén)","code":"","postalCode":"","address":"","legalName":"","legalPhone":"","registrantName":"","registrantPhone":"","registrantTel":null,"registrantMail":"","phone":"","pinyin":"neimengguzishiquguanglibumeng","registerDate":null,"createTime":1528338752423,"updateTime":1528338752423,"status":null,"createUser":null,"departmentType":{"id":1,"name":"管理部門(mén)","pinyin":"guanlibumen","createTime":1528338751963,"updateTime":1528338751963,"createUser":null},"district":{"id":1,"districtType":{"id":1,"name":"省","pinyin":"sheng"},"name":"內(nèi)蒙古自治區(qū)","createUser":null,"pinyin":"neimengguzizhiqu","createTime":null,"updateTime":null},"checkAbility":false,"outOfRange":null,"standard":false},"roles":[],"createUser":null,"updateUser":null}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
Caused by: org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
Caused by: org.h2.jdbc.JdbcSQLException: NULL not allowed for column "DISCIPLINE_ID"; SQL statement:
insert into measurement_unit_category (id, discipline_id, is_asc) values (null, ?, ?) [23502-194]
全局異常處理

理論上我們所有的異常都是由M層拋出,直接捕獲或全局異常處理,是不會(huì)將異常拋給控制器的。

所以,我們需要全局異常處理,M層拋出異常,直接處理,返回xx狀態(tài)碼,而不將異常拋給控制器。

@RestController     // 以rest形式返回異常信息
@ControllerAdvice   // 全局異常處理器
public class GlobalExceptionHandler {

    private final static Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class.getName());

    /**
     * 手動(dòng)捕獲數(shù)據(jù)沖突異常,經(jīng)測(cè)試,該異常系由Spring拋出,但未捕獲
     * @return HttpStatus.CONFLICT
     * 沖突錯(cuò)誤,409
     * 參考:
     * https://stackoverflow.com/questions/37248719/couldnt-catch-dataintegrityviolationexception-with-spring-data-rest
     */
    @ExceptionHandler(value = DataIntegrityViolationException.class)
    public ResponseEntity dataIntegrityViolationException(HttpServletRequest httpServletRequest, Exception exception) {
        logger.error("---數(shù)據(jù)不合法:---Host {} invokes url {} ERROR: {}", httpServletRequest.getRemoteHost(), httpServletRequest.getRequestURL(), exception.getMessage());
        return new ResponseEntity<>(new JsonErrorResult(httpServletRequest, exception), HttpStatus.CONFLICT);
    }
}

我這里對(duì)狀態(tài)碼也不是很熟悉,去StackOverflow上看到一個(gè)老哥是和我遇到了一樣的問(wèn)題,他解決的方案是捕獲異常返回409(沖突),參考原文。

異常捕獲后,修改測(cè)試,期待狀態(tài)碼為409,Conflict。

@Test
public void saveTest() throws Exception {
    logger.debug("基礎(chǔ)測(cè)試數(shù)據(jù)準(zhǔn)備");
    MeasurementUnitCategory measurementUnitCategory = new MeasurementUnitCategory();
    String json = JSON.toJSONString(measurementUnitCategory);

    logger.debug("無(wú)學(xué)科的計(jì)量單位類(lèi)別保存,期待409,沖突狀態(tài)碼");
    this.mockMvc.perform(post(baseUrl)
                        .header(xAuthKey, xAuthToken)
                        .contentType(MediaType.APPLICATION_JSON_UTF8)
                        .content(json))
                .andExpect(status().isConflict());
}

重新運(yùn)行單元測(cè)試,通過(guò)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/69677.html

相關(guān)文章

  • (六講)Spring Boot REST API異常處理指南

    摘要:在本講中,通過(guò)一個(gè)精簡(jiǎn)的項(xiàng)目,著重介紹一些的異常處理技巧?,F(xiàn)在,為了快熟實(shí)現(xiàn)自定義異常信息處理類(lèi),并讓其正常工作,我們可以直接擴(kuò)展提供的類(lèi)來(lái)定義用戶異常信息處理類(lèi)。將異常報(bào)告封裝到對(duì)象中,并回傳給。 能夠正確的處理REST API程序拋出的異常以及返回友好的異常信息是一件非常重要的事情,因?yàn)樗梢詭椭鶤PI客戶端正確的對(duì)服務(wù)端的問(wèn)題作出正確的響應(yīng)。這有助于提高REST API的服務(wù)質(zhì)量。Sp...

    bbbbbb 評(píng)論0 收藏0
  • Spring Boot 2.x 系列教程:WebFlux REST API 全局異常處理 Error

    摘要:挺多人咨詢的,異常處理用切面注解去實(shí)現(xiàn)去全局異常處理。全局異常處理類(lèi),代碼如下代碼解析如下抽象類(lèi)是用來(lái)處理全局錯(cuò)誤時(shí)進(jìn)行擴(kuò)展和實(shí)現(xiàn)注解標(biāo)記的切面排序,值越小擁有越高的優(yōu)先級(jí),這里設(shè)置優(yōu)先級(jí)偏高。 本文內(nèi)容 為什么要全局異常處理? WebFlux REST 全局異常處理實(shí)戰(zhàn) 小結(jié) 摘錄:只有不斷培養(yǎng)好習(xí)慣,同時(shí)不斷打破壞習(xí)慣,我們的行為舉止才能夠自始至終都是正確的。 一、為什么要全局...

    BicycleWarrior 評(píng)論0 收藏0
  • Spring Boot & Spring MVC 異常處理的N種方法

    摘要:定制特定異常返回結(jié)果根據(jù)官方文檔的例子,可以使用和對(duì)特定異常返回特定的結(jié)果。下面是用瀏覽器和訪問(wèn)的結(jié)果無(wú)輸出注意上方表格的錯(cuò)誤,產(chǎn)生這個(gè)的原因前面已經(jīng)講過(guò)。不過(guò)需要注意的是,無(wú)法通過(guò)設(shè)定,由或者容器決定里一律是。 github:https://github.com/chanjarste... 參考文檔: Spring Boot 1.5.4.RELEASE Documentation ...

    h9911 評(píng)論0 收藏0
  • SpringBoot RESTful 應(yīng)用中的異常處理小結(jié)

    摘要:和的區(qū)別方法注解作用于級(jí)別注解為一個(gè)定義一個(gè)異常處理器類(lèi)注解作用于整個(gè)工程注解定義了一個(gè)全局的異常處理器需要注意的是的優(yōu)先級(jí)比高即拋出的異常如果既可以讓標(biāo)注的方法處理又可以讓標(biāo)注的類(lèi)中的方法處理則優(yōu)先讓標(biāo)注的方法處理處理中的異常為了方便地展 @ControllerAdvice 和 @ExceptionHandler 的區(qū)別 ExceptionHandler, 方法注解, 作用于 Co...

    jackzou 評(píng)論0 收藏0
  • spring中的統(tǒng)一異常處理

    摘要:首先,定義一個(gè)存放異常處理函數(shù)的類(lèi),并使用修飾。修飾的方法的寫(xiě)法和內(nèi)的異常處理函數(shù)寫(xiě)法是一樣的??刂粕У姆秶⒁獾?,我是這樣編寫(xiě)注解的它用來(lái)限定這些異常處理函數(shù)起作用的的范圍。使用的機(jī)制,做統(tǒng)一異常處理。 在具體的SSM項(xiàng)目開(kāi)發(fā)中,由于Controller層為處于請(qǐng)求處理的最頂層,再往上就是框架代碼的。因此,肯定需要在Controller捕獲所有異常,并且做適當(dāng)處理,返回給前端一個(gè)友...

    paraller 評(píng)論0 收藏0
  • [Spring cloud 一步步實(shí)現(xiàn)廣告系統(tǒng)] 4. 通用代碼模塊設(shè)計(jì)

    摘要:對(duì)的配置和行為進(jìn)行定制修改匹配路由請(qǐng)求規(guī)則注冊(cè)自定義的和添加靜態(tài)資源處理器添加自定義視圖控制器添加自定義方法參數(shù)處理器配置消息轉(zhuǎn)換器清空所有轉(zhuǎn)換器做一個(gè)好人。博客園掘金簡(jiǎn)書(shū)頭條知乎 一個(gè)大的系統(tǒng),在代碼的復(fù)用肯定是必不可少的,它能解決: 統(tǒng)一的響應(yīng)處理(可以對(duì)外提供統(tǒng)一的響應(yīng)對(duì)象包裝) showImg(https://segmentfault.com/img/remote/146000...

    since1986 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<