복붙노트

[SPRING] 스프링 및 크로스 컨텍스트 : WebAsyncManager를 WebAsyncManager에 캐스팅 할 수 없습니다.

SPRING

스프링 및 크로스 컨텍스트 : WebAsyncManager를 WebAsyncManager에 캐스팅 할 수 없습니다.

Spring 애플리케이션에서 크로스 컨텍스트 기능을 사용하여 webapp1 JSP를 webapp2 JSP로 가져올 수 있습니다. Tomcat 7.0.42 (vFabric TC Server) 및 Spring Framework 3.2.8과 함께 Eclipse STS를 사용하고 있습니다.

나는 Tomcat conf / context.xml을 다음과 같이 설정했다.`

<Context crossContext="true">...</Context>`. 

webapp2 JSP에서 나는`

<c:import context="/webapp1" url="/myurl" />`.

webapp2 JSP를 호출하면이 오류가 발생합니다.

HTTP Status 500 - javax.servlet.ServletException: javax.servlet.jsp.JspException: `java.lang.ClassCastException:` `org.springframework.web.context.request.async.WebAsyncManager cannot be cast to` org.springframework.web.context.request.async.WebAsyncManager`

다른 사람이이 문제가 발생 했습니까?

해결법

  1. ==============================

    1.Spring이 교차 컨텍스트 요청 처리를 위해 준비되지 않은 것 같습니다 (최소한 해킹 비트가없는 경우).

    Spring이 교차 컨텍스트 요청 처리를 위해 준비되지 않은 것 같습니다 (최소한 해킹 비트가없는 경우).

    FrameworkServlet은 항상 요청 속성에서 WebAsyncManager를 가져 오려고합니다. 그리고 추출 된 방식은 다른 컨텍스트 (클래스 로더)에서 작동하지 않습니다.

    이 문제를 해결하는 방법은 두 가지가 있습니다.

  2. ==============================

    2.Atlassian은이 필터를 사용하여 해결 방법이있는 것 같습니다.

    Atlassian은이 필터를 사용하여 해결 방법이있는 것 같습니다.

    https://docs.atlassian.com/atlassian-confluence/latest/com/atlassian/confluence/internal/web/filter/spring/IgnoreWebAsyncManagerFilter.html

    문서에 따르면 :

    어쩌면 당신은 소스 코드를 얻으려고 시도 할 수 있습니다. 그렇게한다면 회신하여 저에게 수업을 보내주십시오. 그렇지 않으면 문제를 재현 할 수 있습니다. 각 요청에 대해 새 객체를 만드는 것처럼 보이므로 교차 컨텍스트로 직렬화되지 않습니다.

  3. ==============================

    3.저는 오늘이 이슈를 보았고 @Sylvain Lecoy의 답변을 토대로 Atlassian 필터 javadoc이 설명하는 방식으로 작동하는 서블릿 필터 구현을 생각해 냈습니다. WebAsyncUtils.getAsyncManager (ServletRequest)를 호출하는 필터 앞에 배치하면 모든 클래스 로더 / 교차 컨텍스트 문제가 해결됩니다.

    저는 오늘이 이슈를 보았고 @Sylvain Lecoy의 답변을 토대로 Atlassian 필터 javadoc이 설명하는 방식으로 작동하는 서블릿 필터 구현을 생각해 냈습니다. WebAsyncUtils.getAsyncManager (ServletRequest)를 호출하는 필터 앞에 배치하면 모든 클래스 로더 / 교차 컨텍스트 문제가 해결됩니다.

    public class IgnoreWebAsyncManagerFilter implements Filter {
    
    static class IgnoreWebAsyncManagerCacheServletRequest extends HttpServletRequestWrapper {
    
        /**
         * Creates a ServletRequest adaptor wrapping the given request object.
         *
         * @param request the {@link ServletRequest} to wrap.
         * @throws IllegalArgumentException if the request is null
         */
        IgnoreWebAsyncManagerCacheServletRequest(HttpServletRequest request) {
            super(request);
        }
    
        /**
         * {@inheritDoc}
         */
        @Override
        public void setAttribute(String name, Object o) {
            if (!name.equals(WebAsyncUtils.WEB_ASYNC_MANAGER_ATTRIBUTE)) {
                super.setAttribute(name, o);
            }
        }
    }
    
    
    /**
     * {@inheritDoc}
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    
    /**
     * {@inheritDoc}
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(new IgnoreWebAsyncManagerCacheServletRequest((HttpServletRequest) request), response);
    }
    
    /**
     * {@inheritDoc}
     */
    @Override
    public void destroy() {
    }
    

    주 : 이것은 모든 요청이 HttpServletRequest 인스턴스라고 가정하지만보다 안전하도록 수정 될 수 있습니다.

  4. ==============================

    4.우리는 며칠 동안 하이브리드 애플리케이션 (개발 : 스프링 부트 애플리케이션 / 프로덕션 : Liferay 포틀릿, Liferay 서버에서 예외 발생)에서이 예외를두고 싸웠습니다.

    우리는 며칠 동안 하이브리드 애플리케이션 (개발 : 스프링 부트 애플리케이션 / 프로덕션 : Liferay 포틀릿, Liferay 서버에서 예외 발생)에서이 예외를두고 싸웠습니다.

    우리의 경우 모든 (불필요한) 서블릿 필터를 비활성화하면 다음과 같이 도움이되었습니다.

  5. from https://stackoverflow.com/questions/22128150/spring-and-cross-context-webasyncmanager-cannot-be-cast-to-webasyncmanager by cc-by-sa and MIT license