anotaciones en primavera MVC
-
03-07-2019 - |
Pregunta
Me gustaría convertir este SimpleFormController para usar el soporte de anotación introducido en Spring MVC 2.5
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>
Básicamente, me gustaría reemplazar toda la configuración XML para el bean /priceincrease.htm
con anotaciones dentro de la clase Java. ¿Es esto posible y, de ser así, cuáles son las anotaciones correspondientes que debo usar?
Gracias, Don
Solución
Se verá algo como lo siguiente, aunque si funciona o no exactamente como depende de su configuración (ver resolución, etc.). También debo señalar que hay cerca de ocho mil millones de formas válidas para escribir esto. Consulte la documentación de Spring, 13.11. 4 " Argumentos de método de controlador admitidos y tipos de retorno " para obtener una descripción general de la locura. También tenga en cuenta que puede autowire el validador
@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";
}
}
Otros consejos
Alguien completó este proyecto con un MVC reciente y está en github, para que puedas ver cómo se modifican todas las clases en comparación con el tutorial de Spring.
Enlace: PriceIncreaseFormController