[SPRING] 경고 : 폐기 콜백을 등록 할 수 없습니다.
SPRING경고 : 폐기 콜백을 등록 할 수 없습니다.
이 경고 메시지는 내 기록에 많이 표시됩니다. 만료 될 때마다 모든 관리 Bean에 적용됩니다. MyFaces Orchestra를 사용하기 때문에 일정 시간이 지나면 만료됩니다.
내 web.xml에 org.springframework.web.context.request.RequestContextListener를 정의했으며 스프링 클래스가 클래스 경로 (즉, 클래스 로딩 문제가 아님)에만 없다.
FacesRequestAttribute의 문서에는 다음과 같이 쓰여 있습니다 :
purchaseController는 실제로 @Controller로 주석 처리 된 단순 관리 빈 (Serializable 만 구현하는 것을 확장하지 않음)이다.
Update1 :
@Scope ( "request")와 @Scope ( "session")의 빈은 영향을받는 것처럼 보입니다. 그래서이 경고가 적절한 흐름에 위험을 초래하는지 여부를 알고 싶었습니다. 나. 무언가가 정말로 그 콜백을 필요로한다면. 그렇지 않다면 lo4j 설정으로 경고를 건너 뛸 것입니다.
업데이트 2 :
나는 조금 더 파고 들었다. 그리고 때때로 이것은 때때로 일어나는 것처럼 보인다. 리스너가 사용되는 경우 RequestContextHolder.currentRequestAttributes ()는 FacesRequestAttributes가 아닌 ServletRequestAttributes를 반환합니다. 그래서 때때로 리스너가 작동하지 않고 RequestContextHolder에 현재 속성을 설정하지 않는 것으로 보입니다.
업데이트 3 :
RequestContextListener에 대한 디버그를 켜고 여기에 결과가 있습니다.
07:21:31,518 DEBUG RequestContextListener:69 - Bound request context to thread: org.apache.catalina.connector.RequestFacade@1190ae9
07:21:31,518 DEBUG RequestContextListener:89 - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@1190ae9
07:21:31,538 WARN FacesRequestAttributes:121 - Could not register destruction callback [org.springframework.beans.factory.support.DisposableBeanAdapter@11aa152] for attribute 'org.apache.myfaces.orchestra.conversation.AccessScopeManager' because FacesRequestAttributes does not support such callbacks
07:21:31,541 WARN FacesRequestAttributes:121 - Could not register destruction callback [org.springframework.beans.factory.support.DisposableBeanAdapter@1552393] for attribute 'localeController' because FacesRequestAttributes does not support such callbacks
....and so on, other request and session beans
빈에 대한 액세스가 시도되기 전에 요청이 삭제 된 것으로 보입니다. 어느 것이 매우 이상합니다. 이것은 서블릿 컨테이너 구현에서 리스너 처리 문제로 인한 것일 수 있습니까?
해결법
-
==============================
1.FacesRequestAttributes의 javadoc에서 다음을 읽을 수 있습니다.
FacesRequestAttributes의 javadoc에서 다음을 읽을 수 있습니다.
그리고 FacesRequestAttributes의 registerDestructionCallback () 메소드는 많은 일을하지 않습니다.
public void registerDestructionCallback(String name, Runnable callback, int scope) { if (logger.isWarnEnabled()) { logger.warn("Could not register destruction callback [" + callback + "] for attribute '" + name + "' because FacesRequestAttributes does not support such callbacks"); } }
하지만 내 이해는 (당신이 선언 한) RequestContextListener이 작업을 돌볼 것입니다. requestDestroyed (ServletRequestEvent requestEvent) 메소드는 다음과 같습니다.
public void requestDestroyed(ServletRequestEvent requestEvent) { ServletRequestAttributes attributes = (ServletRequestAttributes) requestEvent.getServletRequest().getAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE); ServletRequestAttributes threadAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (threadAttributes != null) { // We're assumably within the original request thread... if (attributes == null) { attributes = threadAttributes; } RequestContextHolder.resetRequestAttributes(); LocaleContextHolder.resetLocaleContext(); } if (attributes != null) { attributes.requestCompleted(); if (logger.isDebugEnabled()) { logger.debug("Cleared thread-bound request context: " + requestEvent.getServletRequest()); } } }
ServletRequestAttributes # requestCompleted ()의 javadoc을 살펴보면 다음과 같습니다.
따라서, log4j 설정을 사용하여 WARN을 안전하게 건너 뛸 수 있다고 생각합니다. (아마도 약간의 디버깅 세션을 통해 이것을 확인할 수 있습니다.)
-
==============================
2.나는 추가를 시도했다.
나는 추가를 시도했다.
<listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener>
이 포럼 게시물에 erhan14가 제안한대로.
그리고 그 경고는 나를 위해 사라졌다. 희망이 도움이됩니다.
from https://stackoverflow.com/questions/2077558/warn-could-not-register-destruction-callback by cc-by-sa and MIT license