2009-04-29 6 views
4

je voudrais convertir cette SimpleFormController d'utiliser le support d'annotation introduite dans Spring MVC 2.5annotations dans Spring MVC

Java

public class PriceIncreaseFormController extends SimpleFormController { 

    ProductManager productManager = new ProductManager(); 

    @Override 
    public ModelAndView onSubmit(Object command) 
      throws ServletException { 

     int increase = ((PriceIncrease) command).getPercentage(); 
     productManager.increasePrice(increase); 

     return new ModelAndView(new RedirectView(getSuccessView())); 
    } 

    @Override 
    protected Object formBackingObject(HttpServletRequest request) 
      throws ServletException { 
     PriceIncrease priceIncrease = new PriceIncrease(); 
     priceIncrease.setPercentage(20); 
     return priceIncrease; 
    } 

} 

Spring Config

<!-- Include basic annotation support --> 
<context:annotation-config/>   

<!-- Comma-separated list of packages to search for annotated controllers. Append '.*' to search all sub-packages --> 
<context:component-scan base-package="springapp.web"/> 

<!-- Enables use of annotations on controller methods to map URLs to methods and request params to method arguments --> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> 

<bean name="/priceincrease.htm" class="springapp.web.PriceIncreaseFormController"> 
    <property name="sessionForm" value="true"/> 
    <property name="commandName" value="priceIncrease"/> 
    <property name="commandClass" value="springapp.service.PriceIncrease"/> 
    <property name="validator"> 
     <bean class="springapp.service.PriceIncreaseValidator"/> 
    </property> 
    <property name="formView" value="priceincrease"/> 
    <property name="successView" value="hello.htm"/> 
    <property name="productManager" ref="productManager"/> 
</bean> 

Fondamentalement, je voudrais remplacer toute la configuration XML pour le /priceincrease.htm bean avec des annotations dans la classe Java. Est-ce possible, et si oui, quelles sont les annotations correspondantes que je devrais utiliser?

Merci, Don

+0

Et votre question est ...? –

Répondre

6

Il va ressembler à quelque chose comme ce qui suit, bien que cela fonctionne ou pas exactement comme cela est dépend un peu de votre configuration (résolveur de vue, etc.). Je devrais également noter qu'il y a environ huit milliards de façons valides d'écrire cette chose. Voir la documentation de printemps, 13.11.4 "Supported handler method arguments and return types" pour un aperçu de la folie. Notez également que vous pouvez lier automatiquement le validateur

@Controller 
@RequestMapping("/priceincrease.htm") 
public class PriceIncreaseFormController { 

    ProductManager productManager; 

    @Autowired 
    public PriceIncreaseFormController(ProductManager productManager) { 
     this.productManager = productManager; 
    } 

    // note: this method does not have to be called onSubmit 
    @RequestMapping(method = RequestMethod.POST) 
    public String onSubmit(@ModelAttribute("priceIncrease") PriceIncrease priceIncrease, BindingResult result, SessionStatus status { 

     new PriceIncreaseValidator().validate(priceIncrease, result); 
     if (result.hasErrors()) { 
      return "priceincrease"; 
     } 
     else { 
      int increase = priceIncrease.getPercentage(); 
      productManager.increasePrice(increase); 
      status.setComplete(); 
      return "redirect:hello.htm"; 
     } 
    } 

    // note: this method does not have to be called setupForm 
    @RequestMapping(method = RequestMethod.GET)  
    public String setupForm(Model model) { 
     PriceIncrease priceIncrease = new PriceIncrease(); 
     priceIncrease.setPercentage(20); 
     model.addAttribute("priceIncrease", priceIncrease); 
     return "priceincrease"; 
    } 

} 
+1

Ce sont ces huit milliards de façons valides que je méprise et je finis habituellement par implémenter directement Controller - au moins, je peux tracer l'interface comme il se doit. Les annotations et la hiérarchie du contrôleur de formulaire confondent IMO. – MetroidFan2002

+0

L'élément clé pour moi est que les contrôleurs basés sur des annotations peuvent être testés beaucoup plus facilement que ceux utilisant l'ancienne hiérarchie de classe. Bien sûr, il faut du temps pour s'y habituer. Une autre caractéristique que je ne voudrais plus manquer est la possibilité d'étendre l'injection des paramètres de la méthode, mais le test est l'ost ostious pour moi. –

0

Quelqu'un a terminé ce projet avec un récent MVC et il est sur GitHub, afin que vous puissiez voir comment toutes les classes sont changées par rapport au tutoriel de printemps.

Lien: PriceIncreaseFormController

Questions connexes