[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.Spring이 교차 컨텍스트 요청 처리를 위해 준비되지 않은 것 같습니다 (최소한 해킹 비트가없는 경우).
Spring이 교차 컨텍스트 요청 처리를 위해 준비되지 않은 것 같습니다 (최소한 해킹 비트가없는 경우).
FrameworkServlet은 항상 요청 속성에서 WebAsyncManager를 가져 오려고합니다. 그리고 추출 된 방식은 다른 컨텍스트 (클래스 로더)에서 작동하지 않습니다.
이 문제를 해결하는 방법은 두 가지가 있습니다.
-
==============================
2.Atlassian은이 필터를 사용하여 해결 방법이있는 것 같습니다.
Atlassian은이 필터를 사용하여 해결 방법이있는 것 같습니다.
https://docs.atlassian.com/atlassian-confluence/latest/com/atlassian/confluence/internal/web/filter/spring/IgnoreWebAsyncManagerFilter.html
문서에 따르면 :
어쩌면 당신은 소스 코드를 얻으려고 시도 할 수 있습니다. 그렇게한다면 회신하여 저에게 수업을 보내주십시오. 그렇지 않으면 문제를 재현 할 수 있습니다. 각 요청에 대해 새 객체를 만드는 것처럼 보이므로 교차 컨텍스트로 직렬화되지 않습니다.
-
==============================
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.우리는 며칠 동안 하이브리드 애플리케이션 (개발 : 스프링 부트 애플리케이션 / 프로덕션 : Liferay 포틀릿, Liferay 서버에서 예외 발생)에서이 예외를두고 싸웠습니다.
우리는 며칠 동안 하이브리드 애플리케이션 (개발 : 스프링 부트 애플리케이션 / 프로덕션 : Liferay 포틀릿, Liferay 서버에서 예외 발생)에서이 예외를두고 싸웠습니다.
우리의 경우 모든 (불필요한) 서블릿 필터를 비활성화하면 다음과 같이 도움이되었습니다.
from https://stackoverflow.com/questions/22128150/spring-and-cross-context-webasyncmanager-cannot-be-cast-to-webasyncmanager by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 부트 프로파일을 사용하는 방법 (0) | 2019.02.15 |
---|---|
[SPRING] 스프링 부트 스타터 데이터 휴식, @Notnull 제약 조건이 작동하지 않음 (0) | 2019.02.15 |
[SPRING] Spring-Batch : 다음 단계를 결정하기 위해 StepListener에서 사용자 정의 Job Exit STATUS를 리턴하려면 어떻게해야합니까? (0) | 2019.02.15 |
[SPRING] 자바 응용 프로그램에서 전자 메일을 보내는 중 예외 : 릴레이가 거부되었습니다. (0) | 2019.02.15 |
[SPRING] java.lang.NoSuchMethodError : org.springframework.util.ClassUtils.forName (Ljava) (0) | 2019.02.15 |