2010-02-19 3 views
6

Spring 3.0을 사용하여 RESTful 컨트롤러를 만들려고합니다. 컨트롤러는 포털 응용 프로그램 용 관리 API 용입니다. 내가 수행 할 작업은 다음과 같습니다주석이있는 Spring 3에서 RESTful 컨트롤러를 구성하는 방법은 무엇입니까?

  • GET/API/포털 모든 포털을 나열하려면
  • POST/API/포털은 새 포털
  • GET/API/포털/{ID}에를 만들 수 있습니다 제어 방식을 주석 한 후 기존 포털

을 삭제하려면 기존의 포털

  • 삭제/API/포털/{ID}를 업데이트하는 기존 포털
  • PUT/API/포털/{ID를} 검색 아래 그림과 같이 나는 모든 포털을 나열하거나 새 포털을 작성하는 작업을 찾지 않습니다.

    그래서 내 질문은 :

    • 내가 올바르게 클래스를 주석이 있나요?
    • RESTful 웹 서비스를 구현하기위한 올바른 규칙을 따르고 있습니까?
    • 봄에 고장난 것이 있습니까?

    아래의 코드 추출 나는 내 수업을 주석 한 방법을 보여줍니다

    2010-02-19 01:18:41,733 INFO [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping] - Mapped URL path [/api/portals/] onto handler [[email protected]1717f] 
    2010-02-19 01:18:41,734 INFO [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping] - Mapped URL path [/api/portals/{id}] onto handler [[email protected]1717f] 
    2010-02-19 01:18:41,734 INFO [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping] - Mapped URL path [/api/portals/{id}.*] onto handler [[email protected]1717f] 
    2010-02-19 01:18:41,735 INFO [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping] - Mapped URL path [/api/portals/{id}/] onto handler [[email protected]1717f] 
    2010-02-19 01:18:41,735 INFO [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping] - Mapped URL path [/api/portals] onto handler [[email protected]1717f] 
    2010-02-19 01:18:41,735 INFO [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping] - Mapped URL path [/api/portals.*] onto handler [[email protected]1717f] 
    

    : 시작하는 동안 나는 엔드 포인트를 등록하고 그 봄 일을보고하고

    @Controller 
    @RequestMapping("/api/portals") 
    public final class PortalAPIController 
    { 
        private final static Logger LOGGER = LoggerFactory.getLogger(PortalAPIController.class); 
    
        @RequestMapping(value = "/", method = RequestMethod.GET) 
        public String listPortals(final Model model) 
        { 
         PortalAPIController.LOGGER.debug("Portal API: listPortals()"); 
         . 
         . 
         return "portals"; 
        } 
    
        @RequestMapping(value = "/", method = RequestMethod.POST) 
        public String createPortal(@RequestBody final MultiValueMap<String, String> portalData, final Model model) 
        { 
         PortalAPIController.LOGGER.debug("Portal API: createPortal()"); 
         . 
         . 
         return "portal"; 
        } 
    
        @RequestMapping(value = "/{id}", method = RequestMethod.GET) 
        public String getPortal(@PathVariable("id") final String portalId, final Model model, final HttpServletResponse response) 
         throws IOException 
        { 
         PortalAPIController.LOGGER.debug("Portal API: getPortal()"); 
         . 
         . 
         return "portal"; 
        } 
    
        @RequestMapping(value = "/{id}", method = RequestMethod.PUT) 
        public String updatePortal(@PathVariable("id") final String portalId, 
         @RequestBody final MultiValueMap<String, String> portalData, final Model model, final HttpServletResponse response) 
         throws IOException 
        { 
         PortalAPIController.LOGGER.debug("Portal API: updatePortal()"); 
         . 
         . 
         return "portal"; 
        } 
    
        @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) 
        public String deletePortal(@PathVariable("id") final String portalId, final Model model, final HttpServletResponse response) 
         throws IOException 
        { 
         PortalAPIController.LOGGER.debug("Portal API: deletePortal()"); 
         . 
         . 
         return "portal"; 
        } 
    
        . 
        . 
    } 
    

    그러나 cURL을 사용하여 API를 호출하려고하면

    curl http://localhost:8080/com.btmatthews.minerva.portal/api/portals/ 
    

    또는

    curl http://localhost:8080/com.btmatthews.minerva.portal/api/portals 
    

    나는 다음과 같은 오류를 얻을

    : 내가하려고 할 때
    2010-02-19 01:19:20,199 WARN [org.springframework.web.servlet.PageNotFound] - No mapping found for HTTP request with URI [/com.btmatthews.minerva.portal/api/portals] in DispatcherServlet with name 'portal' 
    2010-02-19 01:19:32,360 WARN [org.springframework.web.servlet.PageNotFound] - No mapping found for HTTP request with URI [/com.btmatthews.minerva.portal/api/portals/] in DispatcherServlet with name 'portal' 
    

    내가 같은 문제를 얻을 수를 크리에이트 :

    curl -F ...... --request POST http://localhost:8080/com.btmatthtews.minerva/api/portals 
    

    을하지만 경우에하는 것은 기존에 운영하려고 자원 (검색, 업데이트 또는 삭제)이 제대로 작동합니다.

    업데이트 :이 솔루션은 @axtavt 님의 의견으로 제공되었습니다. 나는 내 web.xml 서블릿 매핑에서 < url-pattern >/api/* </url-pattern >을 사용하고있었습니다.그것은 < URL 패턴으로 변경 될 필요가 >/</URL 패턴 >

  • +0

    목록에서 value = "/"를 제거하고 메소드를 생성 할 수 있습니다. URL 해석자를 혼동시킬 수 있습니다. 또 다른 주목할 점은 네임 스페이스에 문제가 있다는 것입니다. 메서드는 "com.btmatthews.mars"로 매핑되고 "com.btmatthews.minerva"에 대한 오류가 발생합니다. – giladbu

    +0

    값을 "="가져 오는 것은 아무런 차이가 없지만 테스트를 거친 후 동일한 URL 매핑이 등록되었으므로 어쨌든 제거 할 것입니다. 포털 구성 요소의 패키지 이름은 com.btmatthews.mars이지만 그 위에 빌드 된 응용 프로그램은 com.btmatthews.minerva ....에 패키지되어 있습니다. 그 혼란은 있지만 문제는 아닙니다. –

    +5

    내가 볼 수있는 유일한 가능성은 잘못된 DispatcherServlet의 ''입니다. 이 구성의 경우 '/'이어야합니다. – axtavt

    답변

    0

    http://localhost:8080/portal/api/portals 
    

    는 봄 경고의 URL과 일치하지 않을 당신이 당신의 컬 발췌에 게시되는 URL

    /com.btmatthews.minerva.portal/api/portals 
    

    webapp의 설정 방법, 컨텍스트 경로, Spring 컨텍스트의 모양 등을 모르는 상태에서 진단하기는 어렵지만 이것은 나에게 큰 단서처럼 들릴 수 있습니다.

    +0

    올바른 컨텍스트 루트는 /com.btmatthews.minerva.portal이 아니라 포털입니다. 원래의 질문을 업데이트했습니다. –

    4

    web.xml에있는 url-pattern을 두 번 확인하고 curl 인수와 비교해보십시오.

    Here is an example 전체 Spring MVC 프로세스를 안내합니다.

    0

    몇 가지 실수를 저질렀습니다.

    @RequestMapping(value = "/", method = RequestMethod.GET) 
    
    public String listPortals(final Model model) 
    { 
    } 
    

    여기에서이 메서드는 일부 매개 변수 모델을 받아 들여야 만하지만 통과되지 않았습니다. 그 내부 메서드를 작성해야합니다. 또는 당신이 그것을 전달하려면, 그것을 경로 변수 또는 요청 매개 변수로 보내야합니다.

    @RequestMapping(value = "/{id}", method = RequestMethod.GET) 
    
    public String getPortal(@PathVariable("id") 
    

    여기에 올바른 구문은 @PathVariable(value="id")

    입니다 그리고 이것은 작동하지 않는 경우 다음이 시도 :

    봄 3에서
    @RequestMapping(value = "/SOMETHING", method = RequestMethod.GET) 
    
    +1

    일반적으로 질문을 솔루션으로 업데이트 한 경우이 오래된 질문에 대답하는 것은 일반적으로 도움이되지 않습니다. – zchrykng

    0

    가, 나머지 컨트롤러가 일반 컨트롤러보다는 더 이상 없다 (@Component) 유일한 차이점은 Rest 컨트롤러가 "Views"대신 JSON/XML을 반환한다는 것입니다. 따라서 특수 효과와 관련하여 괜찮습니다. 그러나 볼 수없는 두 가지 누락 된 것들 : 1- 모든 메서드는 "생성"값 (내용 협상을 위해)을 가져야합니다. @RequestMapping (value = "/ {id}", method = RequestMethod.GET, = "application/json")

    2 오브젝트를 JSON/XML로 또는 그 반대로 매핑하려면 일부 유형의 ObjectMapper (예 : Marshaller 및 Unmarshaller)가 필요합니다. 뷰 리졸버 (View Resolver)를 구성하는 대신이 두 가지는 서블릿 구성에 있어야합니다. 그리고 그게되어야합니다.

    관련 문제