Search code examples
spring-mvcspring-4

Request method 'POST' not supported spring 4


Guys the issue is I'm getting the error

Request method 'POST' not supported

Here is my controller :

package com.mintad.spring.controllers;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.mintad.common.beans.Gouvernorate;
import com.mintad.common.service.GouvernorateService;

@RestController
@RequestMapping("/data")
public class DataController {

    private static final Logger LOGGER = LogManager.getLogger(DataController.class);

    @Autowired
    private GouvernorateService gouvernorateService;

    @RequestMapping(value = "/gouvernorates", method = RequestMethod.GET, produces = { "application/json" })
    public ResponseEntity<List<Gouvernorate>> getGouvernorates() throws FileNotFoundException {
        return new ResponseEntity<List<Gouvernorate>>(gouvernorateService.findAll(), HttpStatus.OK);
    }

    @RequestMapping(value = "/addGouvernorate", method = RequestMethod.POST, produces = { "application/json" })
    public @ResponseBody ResponseEntity<Gouvernorate> addGouvernorate(BindingResult result, Model model, @RequestParam(name = "name") String name,
            @RequestParam(name = "delegation") String delegation, @RequestParam(name = "district") String district,
            @RequestParam(name = "postalCode") String postalCode) throws IOException {
        LOGGER.info("addGouvernorate called");
        Gouvernorate gouvernorate = new Gouvernorate(name, delegation, district, postalCode);
        gouvernorateService.addGouvernorat(gouvernorate);
        return new ResponseEntity<Gouvernorate>(gouvernorate, HttpStatus.OK);
    }

    @RequestMapping(value = "/addTest", method = RequestMethod.POST)
    public @ResponseBody String addTest(BindingResult result, Model model) {

        LOGGER.info("addGouvernorate called");
        Gouvernorate gouvernorate = new Gouvernorate("test", "test", "test", "test");
        gouvernorateService.addGouvernorat(gouvernorate);

        return "Your Professional Details Updated";

    }
}

I've tried so many solutions but in vain.

I'm calling the controller method as follows using chrome Postman application :

http://localhost:8080/mintad/data/addTest (POST)
http://localhost:8080/mintad/data/addGouvernorate?name=test&delegation=test&district=test&postalCode=test (POST too)

I'll be thankful for any help !


Solution

  • The controller version I've added is correct but it works only if I disabled crsf in my security configuration class ass follows :

    package com.mintad.spring.security;
    
    import javax.sql.DataSource;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.core.userdetails.UserDetailsService;
    
    @Configuration
    @EnableWebSecurity
    @ComponentScan
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    
        @Autowired
        DataSource dataSource;
    
        @Autowired
        @Qualifier("customUserDetailsService")
        UserDetailsService userDetailsService;
    
        @Autowired
        public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(userDetailsService);
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            // @formatter:off
            http.csrf().disable().
            authorizeRequests()
                .antMatchers("/", "/home","/data").permitAll()
                .and().formLogin().loginPage("/login")
                .defaultSuccessUrl("/welcome").usernameParameter("username").passwordParameter("password")
                .and().exceptionHandling().accessDeniedPage("/404");
            // @formatter:off
        }
    }