请求方法“POST”不支持第4章

时间:2016-04-25 22:48:28

标签: spring-mvc spring-4

伙计问题是我收到了错误

Request method 'POST' not supported

这是我的控制器:

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";

    }
}

我尝试过这么多解决方案但是徒劳无功。

我使用chrome Postman应用程序调用控制器方法如下:

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

我会感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

我添加的控制器版本是正确的,但只有在我的安全配置类中禁用了crsf时它才有效:

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

答案 1 :(得分:0)

伙计们,我对控制器的认真方式完全错了。

因此addTest方法将替换为以下内容:

@RequestMapping(value = "/gouv/", method = RequestMethod.POST)
    public ResponseEntity<String> addGouv(@RequestBody Gouvernorate gouv) {

        log("addGouv called");
        gouvernorateService.addGouvernorate(gouv);

        return new ResponseEntity<String>("User created", HttpStatus.CREATED);

    }

gouvernorateService已自动连线。