[SPRING] 스프링 3.1.2의 버그 (특히 스프링 포틀릿 MVC)입니까?
SPRING스프링 3.1.2의 버그 (특히 스프링 포틀릿 MVC)입니까?
배경: liferay 5.x 서버에 배포 된 Spring MVC 프레임 워크를 사용하여 포틀릿을 개발 중입니다. 현재 3.0.0.RELEASE를 사용 중입니다. 모든 것이 예상대로 잘 작동합니다. 즉, 다음과 같은 특수 효과를 사용할 때 @RenderMapping (params = "myaction = editFolderForm") @RenderMapping (params = "myaction = editEntryForm") @RenderMapping @ActionMapping (params = "myaction = editEntry") 기타 DefaultAnnotationHandlerMapping은 모든 요청에 대한 처리기를 찾는 데 예상대로 작동합니다.
하지만, 몇 가지 유효한 이유 때문에 최신 버전 인 3.1.2.RELEASE 대신 3.0.0.RELEASE를 사용해야합니다.
DefaultAnnotationHandlerMapping이 모든 요청에 대한 처리기를 찾는 데 예상대로 작동하지 않는 것을 관찰했습니다. 스프링 프레임 워크의 내부를 디버깅하여 문제가 무엇인지 알아 냈습니다. 나는 누군가에게 이것이 이것이 버그인지 말해 줄 수 있도록 그것을 분명히 설명하고 싶다.
DefaultAnnotationHandlerMapping의 부모 클래스 인 AbstractMapBasedHandlerMapping에서 다음을 수행합니다.
package org.springframework.web.portlet.handler;
public abstract class AbstractMapBasedHandlerMapping<K> extends AbstractHandlerMapping {
....
....
/**
* Determines a handler for the computed lookup key for the given request.
* @see #getLookupKey
*/
@Override
@SuppressWarnings("unchecked")
protected Object getHandlerInternal(PortletRequest request) throws Exception {
...
if (handler instanceof Map) {
Map<PortletRequestMappingPredicate, Object> predicateMap =
(Map<PortletRequestMappingPredicate, Object>) handler;
List<PortletRequestMappingPredicate> predicates =
new LinkedList<PortletRequestMappingPredicate>(predicateMap.keySet());
LINE 81: Collections.sort(predicates); ///////////////// PROBLEM
for (PortletRequestMappingPredicate predicate : predicates) {
if (predicate.match(request)) {
predicate.validate(request);
return predicateMap.get(predicate);
}
}
return null;
}
return handler;
}
....
....
}
이 정렬은 Spring 3.1.2에서 엉망이며 Spring 3.0.0에서 완벽하게 작동한다. 다음 두 절에서는 왜 분류 작업을하는지, 그리고 어떻게 Spring 3.1.2에서 엉망이되는지 설명 할 것입니다.
이 HandlerMapping은 특정 처리기에 대한 일치 항목을 찾을 때까지 노드별로 정렬 된 연결된 목록 노드를 검색합니다. 내 코드베이스에서 메서드를 다음과 같은 주석으로 매핑 한 여러 컨트롤러가 있습니다.
@RenderMapping ---> 기본값
@RenderMapping (params = "myaction = editEntryController")
@RenderMapping (params = "myaction = editFolderController")
기타
Collections.sort ()는 각 XXXPredicate 클래스의 compareTo (..) 메서드에 의존합니다.
요청이 먼저 오면 myaction 매개 변수가 "editEntryController", "editFolderController"...와 같은지 확인해야합니다. 마지막으로 아무것도 일치하지 않으면 @RenderMapping 주석으로 주석 된 기본 컨트롤러 만 일치해야합니다.
Spring 3.0.0에서는 예상대로 동작한다. Spring 3.2.1 에서처럼, 그렇게 행동하지 않는다.
두 버전 모두 정렬 전에 목록은 동일합니다.
myaction=editEntry,
myaction=editEntryForm,
org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandlerMapping$ResourceMappingPredicate@123bea8a,
myaction=REDIRECT_TO_DEFAULT_PAGE,
, ---------------------------------> This empty string corrsponds to the default @RenderMapping
myaction=selectFolderEntries,
myaction=searchResults,
myaction=addEntry,
myaction=addEntryForm,
myaction=showMyEntries,
myaction=showRecentEntries,
org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandlerMapping$ResourceMappingPredicate@4f1e9e2d,
myaction=editFolder,
myaction=editFolderForm,
myaction=addFolder,
myaction=addFolderForm
정렬 후,
Spring 3.0.0에서는,
org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandlerMapping$ResourceMappingPredicate@123bea8a,
org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandlerMapping$ResourceMappingPredicate@4f1e9e2d,
myaction=editEntry,
myaction=editEntryForm,
myaction=REDIRECT_TO_DEFAULT_PAGE,
myaction=selectFolderEntries,
myaction=searchResults,
myaction=addEntry,
myaction=addEntryForm,
myaction=showMyEntries,
myaction=showRecentEntries,
myaction=editFolder,
myaction=editFolderForm,
myaction=addFolder,
myaction=addFolderForm,
---------------> Default mapping i.e. @RenderMapping
Spring 3.1.2 ([]와 같은 것을 무시한다)
[myaction=editEntry]
[myaction=editEntryForm]
deleteFolder
[myaction=REDIRECT_TO_DEFAULT_PAGE]
[] --------------------------> this is wrongly placed in middle.
[myaction=selectFolderEntries]
[myaction=searchResults]
[myaction=addEntry]
[myaction=addEntryForm]
[myaction=showMyEntries]
[myaction=showRecentEntries]
deleteEntry
[myaction=editFolder]
[myaction=editFolderForm]
[myaction=addFolder]
[myaction=addFolderForm]
null
이것은 연결된 목록입니다. 각 매핑은 첫 번째 노드에서 검사됩니다. 혹시 기본 [] 즉 빈 매핑이 목록의 중간에 발견되면, 그것이 올바른 핸들러이고 나머지 핸들러가 체크되지 않는 것처럼 true가 반환됩니다.
Spring 프레임 워크 3.2.1의 버그입니까?
해결법
-
==============================
1.나는 똑같은 문제가 있었다. 오직 3.1.4 버전 만이 저에게 효과적이었습니다.
나는 똑같은 문제가 있었다. 오직 3.1.4 버전 만이 저에게 효과적이었습니다.
from https://stackoverflow.com/questions/11996771/is-this-a-bug-in-spring-3-1-2-specifically-spring-portlet-mvcs by cc-by-sa and MIT license