日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本文介紹了如何讓Spring@ControllerAdise與其他定制的Spring@Aspects一起工作?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

問題描述

我有一個使用@Aspect的自定義記錄器,我希望它總是在最后運(yùn)行,這樣無論控制器返回什么響應(yīng),它都會被記錄到數(shù)據(jù)庫中(所以我在這個方面放了一個@Order(1))。我還使用@ControllerAdvice編寫了一個錯誤處理程序,它使用自定義響應(yīng)正文處理所有意外異常和返回500,并且我希望記錄器也記錄這一點,因此我在其上放置了@Order(2),然而,放置@Order注釋看起來并不安排Spring方面和Spring ControllerAdility之間的順序,那么我如何讓錯誤處理程序始終在記錄器之前運(yùn)行?(當(dāng)然,不需要將我的錯誤處理程序轉(zhuǎn)到另一個Spring方面)

推薦答案

我一直在尋找并調(diào)試您的主要問題。我沒有找到你關(guān)于@Order的問題的答案,但我會與你分享我的想法(本文的第二部分)

您是否考慮過使用Interceptor

它們提供了在您進(jìn)入控制器之前和@ControllerAdvice執(zhí)行之后(如果有)記錄操作的方法。

@Component
public class WebInterceptor extends HandlerInterceptorAdapter {

    private Logger logger = LoggerFactory.getLogger(WebInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        logger.error("WebInterceptor prehandle is now logged");
        return super.preHandle(request, response, handler);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        logger.error("WebInterceptor after completion is now logged");
        super.afterCompletion(request, response, handler, ex);
    }
}

要激活此偵聽器,您需要創(chuàng)建一個新的@Configuration類,實現(xiàn)WebMvcConfigurer

@Configuration
public class AppConfig implements WebMvcConfigurer {

    @Autowired
    private WebInterceptor webInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(webInterceptor).addPathPatterns("/user");
    }
}

我已經(jīng)為測試創(chuàng)建了一個簡單的ControllerControllerAdvice

@RestController
public class WebController {
    @GetMapping("/user")
    public String user() {
        throw new IllegalArgumentException("my bad");
    }
}


@RestControllerAdvice
@Order(2)
public class WebAdvice {

    private Logger logger = LoggerFactory.getLogger(WebAdvice.class);

    @ExceptionHandler(RuntimeException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public void handle(RuntimeException e) {
        logger.error("ControllerAdvice is now logged");
    }
}

結(jié)果為:

現(xiàn)在已記錄WebAdise句柄
現(xiàn)在已記錄完成后的WebInterceptor

如果您需要記錄請求,也可以查看以下內(nèi)容:https://www.baeldung.com/spring-http-logging

以下是我找到的有關(guān)Order、Aspect和ControllerAdance的信息

你說得對,@ControllerAdvice@Aspect之間沒有優(yōu)先順序,嗯……

我不知道為什么(目前還不知道),但當(dāng)@Aspect指向@Controller方法時,無論您設(shè)置的順序如何,點切都會在@ControllerAdvice之前執(zhí)行

@Aspect
@Component
@Order(1)
public class MyAspect {

    private Logger logger = LoggerFactory.getLogger(MyAspect.class);

    @After("execution(* WebController.user(..))")
    public void afterLog() {
        logger.error("Aspect is now logged");
    }
}

@RestControllerAdvice
@Order(2)
public class WebAdvice {

    private Logger logger = LoggerFactory.getLogger(WebAdvice.class);

    @ExceptionHandler(RuntimeException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public void handle(RuntimeException e) {
        logger.error("ControllerAdvice is now logged");
    }
}

如果Get http://localhost:8080/user,結(jié)果將為:

方面現(xiàn)在已記錄
ControllerAdise現(xiàn)在已記錄

但我發(fā)現(xiàn)了一些有趣的事情:如果您設(shè)置了一個切入點@After@ControllerAdvice,那么您的方面將在ControlerAdance:

之后執(zhí)行

@Aspect
@Component
@Order(1)
public class MyAspect {

    private Logger logger = LoggerFactory.getLogger(MyAspect.class);

    @After("execution(* WebAdvice.handle(..)) || execution(* WebController.user(..))")
    public void afterLog() {
        logger.error("Aspect is now logged");
    }
}

它被執(zhí)行2次。一個在控制器之后,另一個在建議之后。

方面現(xiàn)在已記錄
ControllerAdise現(xiàn)在已記錄
Aspects現(xiàn)在已記錄

也許這可以滿足您的需求,但我真的不認(rèn)為這是一個優(yōu)雅的解決方案…

仍需解決的事情:

找到優(yōu)先于AspectControllerAdvice的方法

希望不管怎樣,它都會有所幫助。如果我找到更好的,我會讓你知道的。

這篇關(guān)于如何讓Spring@ControllerAdise與其他定制的Spring@Aspects一起工作?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,

分享到:
標(biāo)簽:Aspects ControllerAdise Spring 與其他 定制 工作
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定