Adicionando RequestCondition customizado no Spring mvc 3.1

Eu tenho um aplicativo Spring mvc (3.1.1), e eu quero definir condições além do que está disponível no RequestMapping. Eu tenho algumas coisas que eu quero usar.

Primeiro, seria bom se eu pudesse mostrar uma home page diferente para diferentes tipos de usuários:

<code>@Controller
public class HomepageController {

    @RequestMapping(value = "/")
    @CustomCondition(roles = Guest.class)
    public String guestHome() { /*...*/ }

    @RequestMapping(value = "/")
    @CustomCondition(roles = Admin.class)
    public String adminHome() { /*...*/ }

}
</code>

Segundo, eu quero que o aplicativo funcione como um site e como um serviço REST (por exemplo, para aplicativos móveis), então eu quero deixar o site acessar as ações html e json, e deixar o serviço (subdomínio diferente) somente acesse ações de json (algum tipo de@CustomCondition(web = true) que corresponde apenas aos URLs do site)

Isso pode funcionar para qualquer um dos dois usos que estou planejando?

Eu encontrei muito pouca documentação sobre condições personalizadas, mas acheium exemplo naquelaimplementa condições personalizadas que pode ser o que eu quero, mas usa um@Configuration classe em vez da configuração XML que estou usando e eu não quero mover toda a minha definição xml primavera para um@Configuration classe.

Posso definir um customMethodCondition paraRequestMappingHandlerMapping no XML?

Eu tentei subclassingRequestMappingHandlerMapping e anulargetCustomMethodCondition, para devolver meu costumeRequestCondition, mas não funcionou -getMatchingCondition() na minha condição não disparou.

Qualquer ajuda seria muito apreciada!

ATUALIZAR

Eu li um pouco mais, e pareceRequestMappingHandlerMapping é uma nova classe (desde a versão 3.1).

O que acontece no meu aplicativo é que o @Configuration que tenta substituir e, assim, redefinir orequestMappingHandlerMapping bean realmente funciona, mas os mapeamentos de url (@RequestMapping métodos em@Controllers) parecemseja processado duas vezes, uma vez pela subclasseExtendedRequestMappingHandlerMapping e uma vez pelo originalRequestMappingHandlerMapping - primeiro com uma condição personalizada e, novamente, sem ela.

Bottom line é minhas condições personalizadas são simplesmente ignoradas.

Este é suposto ser um padrão avançado, mas IMO deve ser bastante comum ...

Comentários alguém?

questionAnswers(2)

yourAnswerToTheQuestion