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; }