0

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!!!

Iakov Burtsev
  • 377
  • 1
  • 2
  • 15

0 Answers0