Java >> Java Program >  >> Tag >> java.lang

java.lang.IllegalStateException:Ingen trådbunden begäran hittades, undantag i aspekt

Följande är min aspekt:

    @Configurable
    @Aspect
    public class TimingAspect {

        @Autowired
        private HttpServletRequest httpServletRequest;

        // Generic performance logger for any mothod
        private Object logPerfomanceInfo(ProceedingJoinPoint joinPoint, String remoteAddress) {
            StringBuilder tag = new StringBuilder();
            if (joinPoint.getTarget() != null) {
                tag.append(joinPoint.getTarget().getClass().getName());
                tag.append(".");
            }
            tag.append(joinPoint.getSignature().getName());
            StopWatch stopWatch = new StopWatch(tag.toString());
            Object result = joinPoint.proceed(); // continue on the intercepted method
            stopWatch.stop();

            PerformanceUtils.logInPerf4jFormat(stopWatch.getStartTime(), stopWatch.getElapsedTime(), stopWatch.getTag(), stopWatch.getMessage(), remoteAddress);
            return result;
        }

        @Around("execution(* $$$.$$$.$$$.api.controller.*.*(..))")
        public Object logAroundApis(ProceedingJoinPoint joinPoint) throws Throwable {
            String remoteAddress = null;
            if (httpServletRequest != null) {
               remoteAddress = httpServletRequest.getRemoteAddr();
            }
            return logPerfomanceInfo(joinPoint, remoteAddress);
        }

        @Around("execution(* $$$.$$$.$$$.$$$.$$$.$$$.*(..))")
        public Object logAroundService(ProceedingJoinPoint joinPoint) throws Throwable {
            String remoteAddress = null;
            if (httpServletRequest != null) {
                remoteAddress = httpServletRequest.getRemoteAddr();
            }
            return logPerfomanceInfo(joinPoint, remoteAddress);
        }

Jag får inga kompileringstidsfel men jag gör följande undantag när jag startar min bryggserver:

kapslat undantag är java.lang.IllegalStateException:Ingen trådbunden förfrågan hittades:Syftar du på förfrågningsattribut utanför en faktisk webbförfrågan, eller bearbetar du en förfrågan utanför den ursprungligen mottagande tråden? Om du faktiskt arbetar inom en webbförfrågan och fortfarande får det här meddelandet, körs din kod förmodligen utanför DispatcherServlet/DispatcherPortlet:Använd i det här falletRequestContextListener eller RequestContextFilter för att visa den aktuella begäran.

En sak att notera här är att om jag tar bort "logAroundService"-metoden får jag inga undantag.

Svar

Du bör inte koppla en HttpServletRequest automatiskt i din aspekt eftersom detta kommer att binda din aspekt till att endast köras för klasser som anropas från en exekverande HttpServletRequest .

Använd istället RequestContextHolder för att få förfrågan när du behöver en.

private String getRemoteAddress() {
    RequestAttributes attribs = RequestContextHolder.getRequestAttributes();
    if (attribs instanceof NativeWebRequest) {
        HttpServletRequest request = (HttpServletRequest) ((NativeWebRequest) attribs).getNativeRequest();
        return request.getRemoteAddr();
    }
    return null;
}

Java-tagg