복붙노트

[SPRING] Spring 데이터 Rest 컨트롤러 : @BasePathAwareController, @RepositoryRestController, @Controller 및 @RestController의 동작 및 사용법

SPRING

Spring 데이터 Rest 컨트롤러 : @BasePathAwareController, @RepositoryRestController, @Controller 및 @RestController의 동작 및 사용법

Spring Data Rest Controllers의 정확한 동작을 이해하려고합니다.

4 가지 종류의 주석 된 컨트롤러를 테스트하기위한 간단한 구현을 만들었습니다 : @BasePathAwareController, @RepositoryRestController, @RestController, @Controller

컨트롤러는 리포지토리의 엔터티 "author"에 대한 매핑을 가지고 있습니다.

이것은 컨트롤러입니다.

@BasePathAwareController
//@RepositoryRestController
//@RestController
//@Controller
public class MyController {

    @RequestMapping(value="authors/mycontroller/test")
    public void handleRequest(){
        System.out.println("handleRequest of class MyController");
    }

    @RequestMapping(value="/authors/mycontroller/testslash")
    public void handleSlashRequest(){
        System.out.println("handleSlashRequest of class MyController");
    }

    @RequestMapping(value="api/authors/mycontroller/test")
    public void handleApiRequest(){
        System.out.println("handleApiRequest of class MyController");
    }

    @RequestMapping(value="/api/authors/mycontroller/testslash")
    public void handleSlashApiRequest(){
        System.out.println("handleSlashApiRequest of class MyController");
    }

}

내가 사용할 올바른 맵핑에 대해 몇 가지 의구심이 있기 때문에 4 가지 방법을 테스트 중입니다.

모든 실험에서, 나는 그 실험에 필요한 주석을 간단하게 분해하여 이름이 다른 매핑을 가진 컨트롤러를 사용합니다.

HTTP GET으로이 두 URL을 호출합니다.

http://localhost:8080/myApp/api/mycontroller/test
http://localhost:8080/myApp/api/mycontroller/testslash

이것은 @BasePathAwareController를 사용하여 얻은 결과입니다.

http://localhost:8080/myApp/api/mycontroller/test
    White page, No errors, No print on console

http://localhost:8080/myApp/api/mycontroller/testslash
    White page, No errors, No print on console

@RepositoryRestController를 사용한 결과입니다.

http://localhost:8080/myApp/api/mycontroller/test
    White page, No errors, No print on console

http://localhost:8080/myApp/api/mycontroller/testslash
    White page, and this message on the console (only for the first HTTP GET on this url):
    jul 27, 2016 9:23:57 AM org.springframework.web.servlet.DispatcherServlet noHandlerFound
    WARNING: No mapping found for HTTP request with URI [/myApp/api/authors/mycontroller/testslash] in DispatcherServlet with name 'rest'

@RestController를 사용하면 다음과 같은 결과가 나타납니다.

http://localhost:8080/myApp/api/mycontroller/test
    White page, in console: "handleRequest of class MyController"

http://localhost:8080/myApp/api/mycontroller/testslash
    White page, in console: "handleSlashRequest of class MyController"

마지막으로, @Controller를 사용한 결과입니다.

http://localhost:8080/myApp/api/mycontroller/test
    HTTP STATUS 404, in console: "handleRequest of class MyController"

http://localhost:8080/myApp/api/mycontroller/testslash
    HTTP STATUS 404, in console: "handleSlashRequest of class MyController"

For both urls I have this warning:

jul 27, 2016 9:28:11 AM org.springframework.web.servlet.DispatcherServlet noHandlerFound
WARNING: No mapping found for HTTP request with URI [/myApp/api/authors/mycontroller/authors/mycontroller/test] in DispatcherServlet with name 'rest'

나는 무슨 일이 일어나고 있는지 이해하지 못한다.

예상 결과를 제공하는 유일한 주석은 @RestController입니다.

@Controller는 작동하는 것 같지만 HTTP 상태 404가 있고 일치하지 않는 URL / myApp / api / authors / mycontroller / authors / mycontroller / test가있는 메시지가 있습니다. 콘솔에서 올바른 처리 메시지.

다른 두 개의 주석 (@BasePathAwareController 및 @RepositoryRestController)은 아무 것도 수행하지 않습니다.

요약하자면:

모든 종류의 @Controller의 동작 및 사용법에 대한 명확한 설명이 있으면 크게 감사하겠습니다.

감사.

해결법

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

    1.나는 모든 주석이 달린 컨트롤러를 만드는 방법을 발견했으며, 여기에서 그것을 공유한다.

    나는 모든 주석이 달린 컨트롤러를 만드는 방법을 발견했으며, 여기에서 그것을 공유한다.

    @BasePathAwareController 및 @RepositoryRestController는 클래스 수준에서 @RequestMapping을 가져야합니다.

    @RepositoryRestController
    //@BasePathAwareController
    @RequestMapping(value="/authors/mycontroller")
    public class MyController {
    
        @RequestMapping(value="/test")
        public void handleRequest(){
            //...
        }
    }
    

    클래스 수준에서 매핑이 없으면 두 컨트롤러가 모두 처리되지 않습니다.

    이전 테스트에서 메소드가 호출되지 않았기 때문에 그것이 이유입니다.

    클래스 수준에서의 매핑은 "/"로 시작할 수 있으며 두 경우 모두 사용할 수 있습니다.

    또한 구성 컨텍스트에 를 추가하면 "URI가있는 HTTP 요청에 대한 매핑이 없습니다"라는 경고가 사라진 것으로 나타났습니다.

  2. ==============================

    2.REST API를 사용할 때 @RestController를 사용해야합니다.

    REST API를 사용할 때 @RestController를 사용해야합니다.

    추가 정보는 봄용 문서를 참조하십시오.

  3. from https://stackoverflow.com/questions/38607421/spring-data-rest-controllers-behaviour-and-usage-of-basepathawarecontroller by cc-by-sa and MIT license