Convenção sobre configuração com Spring MVC usando ControllerClassNameHandlerMapping?
-
20-08-2019 - |
Pergunta
Seguindo as instruções de Primavera Fonte e da Primavera livro em Ação, estou tentando configurar Spring MVC de uma forma que a configuração minimiza xml. No entanto, segundo Primavera Fonte isto é como você configurar o ControllerClassNameHandlerMap
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
<bean id="viewShoppingCart" class="x.y.z.ViewShoppingCartController">
<!-- inject dependencies as required... -->
</bean>
O que me parece ser completamente inútil, pois é realmente simples de usar os manipuladores de apenas definir os grãos manualmente, como é aproximadamente a mesma quantidade de XML.
Agora, a Primavera livro em Ação faz parecer que tudo que você precisa é a primeira linha desse bloco de código para usar o ControllerClassNameHandlerMapping, o que tornaria muito mais útil. No entanto, eu ainda não foram capazes de chegar a este trabalho.
Qualquer pessoa pode com Spring experiência ajuda-me para fora?
Solução
Há realmente duas coisas diferentes acontecendo aqui:
- o mapeamento entre URLs e controladores
- a definição dos controladores como Spring beans
Para # 1, se você definir o ControllerClassNameHandlerMapping como você fez, que cuida do mapeamento de URL para controlador. Por exemplo, http://example.com/context/home -> HomeController
Para # 2, você pode definir o feijão controlador como você fez. Ou você pode ir para o caminho de usar as anotações 2,5 de estilo Primavera para @Controllers e auto-fiação, o que elimina a necessidade de definições de feijão XML. Ou não, a escolha é até você.
O que você evitar usando ControllerClassNameHandlerMapping está tendo para mapear explicitamente todas as suas URLs potenciais para Controllers. Temos utilizado este sucesso.
Uma outra coisa que você pode querer usar é o DefaultRequestToViewNameTranslator:
<!-- Generates view names based on the request url (e.g. "/home.htm" => "home", "/user/list.htm" => "user/list", etc.) -->
<bean id="viewNameTranslator" class="org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator"/>
Nós também usamos o UrlBasedViewResolver:
<!-- Maps view names to tiles view definitions files. E.g., "home" => "home", etc. -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/>
</bean>
Outras dicas
Eu não acho que usando ControllerClassNameHandlerMapping é uma prática boa engenharia, como é realmente impedi-lo de fazer o trabalho refatoração na classe java Controller.