2016-08-21 61 views
1

我有一種方法可以讓您評論客戶,並在添加評論之後將您重新導向站點並提供評論。如何防止Spring 4.0 MVC @ModelAttribute變量出現在URL中?

@RequestMapping(value="customers/details/{id}", method = RequestMethod.GET) 
    public String showCustomerComments(@ModelAttribute("commentContent") String commentContent, @PathVariable int id, Model model){ 

     model.addAttribute("comment",commentRepository.getAllComments(id)); 

     return "details"; 
    } 

    @RequestMapping(value ="customers/details/{id}", method = RequestMethod.POST) 
    public String processAddCustomerComment(@ModelAttribute("commentContent") String commentContent, @PathVariable int id){ 

     commentRepository. 
       addComment(commentContent, localDate.now().toString(), id); 

     return "redirect:/customers/details/{id}"; 
    } 
} 

一切工作正常,但在URL中出現的模型veriable:

http://localhost:8080/customers/details/62?commentContent=some_text 

我已經知道了解決方案,但我不知道如何實現它。解決方法是在ignoreDefaultModelOnRedirect上設置ignoreDefaultModelOnRedirect爲真。在這個主題enter link description here他們說只要把<mvc:annotation-driven ignoreDefaultModelOnRedirect="true" />放到我們的xml文件中。但如何在基於Java的配置中做到這一點?

我有一個這樣的類:

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = "com.packt.webstore") 
public class WebConfiguration extends WebMvcConfigurerAdapter { 

    @Bean 
    public ViewResolver viewResolver() { 
     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
     viewResolver.setPrefix("/WEB-INF/views/"); 
     viewResolver.setSuffix(".jsp"); 
     return viewResolver; 
    } 

    @Bean 
    public CommonsMultipartResolver multipartResolver(){ 
     CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); 
     multipartResolver.setMaxUploadSize(10240000); 
     return multipartResolver; 
    } 

    @Bean 
    public LocaleResolver localeResolver(){ 
     SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver(); 
     sessionLocaleResolver.setDefaultLocale(new Locale("en")); 
     return sessionLocaleResolver; 
    } 

    @Bean 
    public LocaleChangeInterceptor localeChangeInterceptor(){ 
     LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); 
     localeChangeInterceptor.setParamName("lang"); 
     return localeChangeInterceptor; 
    } 

    @Bean 
    public MessageSource messageSource(){ 
     ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); 
     messageSource.setBasename("messages"); 
     return messageSource; 
    } 


    @Override 
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/resources/**") 
       .addResourceLocations("resources/"); 
    } 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
     registry.addInterceptor(localeChangeInterceptor()); 
    } 

} 

,我還以爲要添加到它:

@Bean 
public RequestMappingHandlerAdapter requestMappingHandlerAdapter(){ 
RequestMappingHandlerAdapter requestMappingHandlerAdapter = new RequestMappingHandlerAdapter(); 
requestMappingHandlerAdapter.ignoreDefaultModelOnRedirect(true); 
return requestMappingHandlerAdapter; 
} 

,但忽略了最低的工作。

我可以添加到processAddCustomerComment mehtod:

model.asMap().clear(); 
return "redirect:" + news.getUrl(); 

但我不滿意這個解決方案。因爲假設我們有20個像我這樣的方法,我不想把這兩行代碼放到這20個方法的每一箇中。

我該如何解決問題?

+0

是否有你使用@ModelAttribute而不是@RequestParam的原因? – Deroude

回答

2

您的實施可能無法正常工作,因爲RequestMappingHandlerAdapter已經在上下文中。添加另一個不會改變事實上使用的那個。 This article建議您自動裝入現有的RequestMappingHandlerAdapter並改爲設置屬性。

@EnableWebMvc 
@Configuration 
public class MyWebConfig { 
    @Autowired 
    private RequestMappingHandlerAdapter requestMappingHandlerAdapter; 

    @PostConstruct 
    public void init() { 
     requestMappingHandlerAdapter.setIgnoreDefaultModelOnRedirect(true); 
    } 
    ...... 
} 

所有積分go to http://www.logicbig.com/的報價代碼。

話雖如此,除非你有使用@ModelAttribute的具體原因,你應該切換到@RequestParam,這是更簡單,少附加字符串。這裏的this topic詳細討論。

相關問題