복붙노트

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

    1.나는 똑같은 문제가 있었다. 오직 3.1.4 버전 만이 저에게 효과적이었습니다.

    나는 똑같은 문제가 있었다. 오직 3.1.4 버전 만이 저에게 효과적이었습니다.

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