У меня есть метод, позволяющий прокомментировать клиент и после добавления комментария перенаправить вас снова на сайт с комментариями.Как предотвратить появление переменных 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 методов.
Как решить проблему?
Есть ли причина, по которой вы используете @ModelAttribute вместо @RequestParam? – Deroude