복붙노트

[SPRING] Spring Boot 405 POST 메소드가 지원되지 않습니까?

SPRING

Spring Boot 405 POST 메소드가 지원되지 않습니까?

스프링 부트 MVC가 POST 메소드를 어떻게 지원하지 않을 수 있습니까? 엔티티 목록을 받아들이는 간단한 게시 메서드를 구현하려고합니다. 여기에 내 코드가 있습니다.

@RestController(value="/backoffice/tags")
public class TagsController {

    @RequestMapping(value = "/add", method = RequestMethod.POST)
        public void add(@RequestBody List<Tag> keywords) {
            tagsService.add(keywords);
        }
}

이 URL을 다음과 같이 누르십시오.

http://localhost:8090/backoffice/tags/add

요청 본문 :

[{"tagName":"qweqwe"},{"tagName":"zxczxczx"}]

나는 받는다 :

{
    "timestamp": 1441800482010,
    "status": 405,
    "error": "Method Not Allowed",
    "exception": "org.springframework.web.HttpRequestMethodNotSupportedException",
    "message": "Request method 'POST' not supported",
    "path": "/backoffice/tags/add"
} 

편집하다:

스프링 웹 요청 핸들러 디버깅

     public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.checkRequest(request); 

 protected final void checkRequest(HttpServletRequest request) throws ServletException {
        String method = request.getMethod();
        if(this.supportedMethods != null && !this.supportedMethods.contains(method)) {
            throw new HttpRequestMethodNotSupportedException(method, StringUtils.toStringArray(this.supportedMethods));
        } else if(this.requireSession && request.getSession(false) == null) {
            throw new HttpSessionRequiredException("Pre-existing session required but none found");
        }
    }

supportedMethods의 두 가지 메소드는 {GET, HEAD}뿐입니다.

해결법

  1. ==============================

    1.RestController 어노테이션 정의에 오류가 있습니다. 문서에 따르면 :

    RestController 어노테이션 정의에 오류가 있습니다. 문서에 따르면 :

    즉, 입력 한 값 ( "/ backoffice / tags")이 사용 가능한 경로가 아닌 컨트롤러의 이름입니다.

    @RequestMapping ( "/ backoffice / tags")을 컨트롤러 클래스에 추가하고 @RestController 주석에서 값을 제거하십시오.

    편집하다: 주석이 작동하지 않는다는 완전한 예제가 있습니다.이 코드를 사용해보십시오. IDE에서 로컬로 실행하십시오.

    build.gradle

    buildscript {
        ext {
            springBootVersion = '1.2.5.RELEASE'
        }
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
            classpath("io.spring.gradle:dependency-management-plugin:0.5.2.RELEASE")
        }
    }
    
    apply plugin: 'java'
    apply plugin: 'eclipse'
    apply plugin: 'idea'
    apply plugin: 'spring-boot' 
    apply plugin: 'io.spring.dependency-management' 
    
    jar {
        baseName = 'demo'
        version = '0.0.1-SNAPSHOT'
    }
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
    
    repositories {
        mavenCentral()
    }
    
    
    dependencies {
        compile("org.springframework.boot:spring-boot-starter-web")
        testCompile("org.springframework.boot:spring-boot-starter-test") 
    }
    
    
    eclipse {
        classpath {
             containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')
             containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8'
        }
    }
    
    task wrapper(type: Wrapper) {
        gradleVersion = '2.3'
    }
    

    Tag.java

    package demo;
    
    import com.fasterxml.jackson.annotation.JsonCreator;
    import com.fasterxml.jackson.annotation.JsonProperty;
    
    public class Tag {
    
        private final String tagName;
    
        @JsonCreator
        public Tag(@JsonProperty("tagName") String tagName) {
            this.tagName = tagName;
        }
    
        public String getTagName() {
            return tagName;
        }
    
        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder("Tag{");
            sb.append("tagName='").append(tagName).append('\'');
            sb.append('}');
            return sb.toString();
        }
    }
    

    SampleController.java

    package demo;
    
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    
    @RestController
    @RequestMapping("/backoffice/tags")
    public class SampleController {
    
        @RequestMapping(value = "/add", method = RequestMethod.POST)
        public void add(@RequestBody List<Tag> tags) {
            System.out.println(tags);
        }
    }
    

    DemoApplication.java

    package demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class DemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }
    
  2. ==============================

    2.실제로 메서드 이름을 사용할 수 있지만 메서드 유형이 필요한 형식과 다른 경우이 예외는 405를 throw합니다.

    실제로 메서드 이름을 사용할 수 있지만 메서드 유형이 필요한 형식과 다른 경우이 예외는 405를 throw합니다.

  3. from https://stackoverflow.com/questions/32479919/spring-boot-405-post-method-not-supported by cc-by-sa and MIT license