2016-08-21 2 views
1

У меня есть метод, позволяющий прокомментировать клиент и после добавления комментария перенаправить вас снова на сайт с комментариями.Как предотвратить появление переменных URL Spring 4.0 MVC @ModelAttribute?

@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 true на ignoreDefaultModelOnRedirect. В этом разделе enter link description here они говорят, что просто введите sth как <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; 
} 

но dosen't работу.

Я мог бы добавить к 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); 
    } 
    ...... 
} 

Все кредиты перейдите по ссылке http://www.logicbig.com/ для цитируемого кода.

Это, если у вас есть конкретные причины для использования @ModelAttribute, возможно, вы должны перейти на @RequestParam, что проще, чем меньше строк. Вот this topic обсуждается подробно.

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