2009-04-29 7 views
4

Я хотел бы преобразовать эту SimpleFormController использовать аннотацию поддержку введенной в Spring MVC 2,5аннотаций в 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> 

В принципе, я бы хотел заменить всю конфигурацию XML для /priceincrease.htm bean с аннотациями в классе Java. Возможно ли это, и если да, то каковы соответствующие аннотации, которые я должен использовать?

Спасибо, Дон

+0

И ваш вопрос ...? –

ответ

6

Это будет выглядеть примерно следующим, хотя ли это работает или не так, как это будет зависеть немного от конфигурации (вид распознавателя, и т.д.). Я должен также отметить, что существует около восьми миллиардов действительных способов написать эту вещь. См. Документацию весны, 13.11.4 "Supported handler method arguments and return types" для обзора безумия. Также обратите внимание, что вы можете autowire валидатора

@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

Это восемь миллиардов действительных способов, которые я презираю, и я обычно просто заканчиваю реализацию Controller напрямую - по крайней мере, я могу проследить интерфейс по мере необходимости. И аннотации, и иерархия контроллера формы смешивают ИМО. – MetroidFan2002

+0

Ключевым моментом для меня является то, что контроллеры, основанные на аннотациях, могут быть протестированы по модулю намного проще, чем те, которые используют старую иерархию классов. Конечно, для этого нужно время. Еще одна особенность, о которой я больше не хотел бы пропустить, - это возможность расширения метода ввода параметров метода, но тестирование является остеовальным для меня. –

0

Кто-то завершило этот проект с недавним MVC, и это на GitHub, так что вы можете увидеть, как все классы изменились по сравнению с обучающим Спрингом.

Ссылка: PriceIncreaseFormController

Смежные вопросы