I have jsp file, where there is a form:
<form:form modelAttribute="user" class="form-horizontal" method="put"
enctype="multipart/form-data" action="edit"
charset="utf-8" accept-charset="UTF-8">
...
</form:form>
Here I use spring's taglib:
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
In my WebApp class I added hiddenHttpMethodFilter:
public class WebApp implements WebApplicationInitializer {
private static final String DISPATCHER_SERVLET_NAME = "dispatcher";
private static final String DISPATCHER_SERVLET_MAPPING = "/";
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.register(SpringRootConfig.class);
rootContext.register(SpringWebConfig.class);
rootContext.register(SpringDbConfig.class);
rootContext.register(SpringSecurityConfig.class);
ServletRegistration.Dynamic servlet = servletContext.addServlet(
DISPATCHER_SERVLET_NAME, new DispatcherServlet(rootContext)
);
servlet.setLoadOnStartup(1);
servlet.addMapping(DISPATCHER_SERVLET_MAPPING);
FilterRegistration.Dynamic hiddenHttpMethodFilter = servletContext
.addFilter("hiddenHttpMethodFilter", new HiddenHttpMethodFilter());
hiddenHttpMethodFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");
FilterRegistration.Dynamic encodingFilter = servletContext
.addFilter("encodingFilter", new CharacterEncodingFilter());
encodingFilter.setInitParameter("encoding", "UTF-8");
encodingFilter.setInitParameter("forceEncoding", "true");
encodingFilter.addMappingForUrlPatterns(null, true, "/*");
FilterRegistration.Dynamic securityFilter = servletContext
.addFilter(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME, DelegatingFilterProxy.class
);
securityFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, "/*");
servletContext.addListener(new ContextLoaderListener(rootContext));
}
}
I don't know why I can't sent PUT request from this form. This form sent POST request, and I get error: Request method 'POST' not supported. Before I use @PostMapping(value = "/edit")
annotation in my controller method, but when I changed it to @PutMapping(value = "/edit")
I met with this problem. How can I fix it???
My controller with method that should handle PUT request:
@Controller
public class RootController extends AbstractUserController {
@PutMapping(value = "/edit")
public String updateProfile(@Valid User user, BindingResult result) {
if (!result.hasErrors()) {
try {
user.setId(AuthorizedUser.id());
super.update(user, user.getId());
AuthorizedUser.get().update(user);
return "redirect:profile";
} catch (DataIntegrityViolationException e) {
result.addError(new FieldError("user", "email", "already registered!"));
}
}
return "register";
}
}
P.S.: In my other jsp I use simple html form without spring taglib:
<form method="post" action="friends?friendId=${user.id}">
<input type="hidden" name="_method" value="delete">
<spring:message code="friends.delete" var="delete_from_friends"/>
<input type="submit" class="btn btn-danger" value="${delete_from_friends}">
</form>
and it works!!!