Este é um bug no Spring 3.1.2 (especificamente Spring Portlet MVC)?

Background: Estou desenvolvendo um Portlet usando a estrutura Spring MVC implantada no servidor liferay 5.x. Atualmente estou usando o 3.0.0.RELEASE. Tudo está funcionando bem como esperado. Ou seja, quando eu uso anotações como @RenderMapping (params = "minhaação = editFolderForm") @RenderMapping (params = "myaction = editEntryForm") @RenderMapping
@ActionMapping (params = "myaction = editEntry") etc. O DefaultAnnotationHandlerMapping está funcionando como esperado ao encontrar um manipulador para cada solicitação.

Mas, por algum motivo válido, eu tenho que usar mais versão mais recente que é 3.1.2.RELEASE em vez de 3.0.0.RELEASE.

Observei que DefaultAnnotationHandlerMapping NÃO ESTÁ FUNCIONANDO conforme esperado ao encontrar um manipulador para cada solicitação. Eu descobri qual é o problema depurando os componentes internos do framework Spring. Eu quero explicar isso claramente para que alguém possa me dizer se isso é um Bug.

Na classe pai de DefaultAnnotationHandlerMapping que é 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;
}
....
....
}

Esta classificação está estragada no Spring 3.1.2 e está funcionando perfeitamente no Spring 3.0.0. Nas próximas duas seções, vou lhe dizer por que a classificação é importante e como ela é danificada na primavera 3.1.2.

por que classificar questões?

Esse HandlerMapping está pesquisando um nó de lista vinculado classificado por nó até encontrar correspondência para um manipulador específico. Na minha base de código, eu tenho vários controladores cujos métodos são mapeados com as seguintes anotações como

@RenderMapping ---> padrão

@RenderMapping (params = "myaction = editEntryController")

@RenderMapping (params = "myaction = editFolderController")

etc.

O Collections.sort () depende do método compareTo (..) de cada classe XXXPredicate.

Quando um pedido vem primeiro, deve ser verificado se myaction parâmetro é igual a "editEntryController", "editFolderController", ... e, finalmente, se nada corresponde, thn apenas controlador padrão que é anotado com anotação @RenderMapping deve ser correspondido.

Com o Spring 3.0.0, está funcionando exatamente como esperado. Onde, como na Primavera 3.2.1, não se comporta assim.

Com ambas as versões, antes de ordenar, a lista é a mesma.

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

Após a classificação,

Com o 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

Com a Spring 3.1.2 (ignore coisas como []),

[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

Esta é uma lista vinculada. E cada mapeamento é verificado no primeiro nó. Sempre que o padrão [], ou seja, um mapeamento vazio é encontrado no meio da lista, true está sendo retornado como se esse fosse o manipulador direito e o restante dos manipuladores não fosse verificado.

Então, isso é um bug no Spring framework 3.2.1?

questionAnswers(1)

yourAnswerToTheQuestion