복붙노트

[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. ==============================

    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. ==============================

    2.나는 추가를 시도했다.

    나는 추가를 시도했다.

    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>
    

    이 포럼 게시물에 erhan14가 제안한대로.

    그리고 그 경고는 나를 위해 사라졌다. 희망이 도움이됩니다.

  3. from https://stackoverflow.com/questions/2077558/warn-could-not-register-destruction-callback by cc-by-sa and MIT license