Spring 3.0을 사용하여 RESTful 컨트롤러를 만들려고합니다. 컨트롤러는 포털 응용 프로그램 용 관리 API 용입니다. 내가 수행 할 작업은 다음과 같습니다주석이있는 Spring 3에서 RESTful 컨트롤러를 구성하는 방법은 무엇입니까?
- GET/API/포털 모든 포털을 나열하려면
- POST/API/포털은 새 포털
- GET/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 패턴 >
목록에서 value = "/"를 제거하고 메소드를 생성 할 수 있습니다. URL 해석자를 혼동시킬 수 있습니다. 또 다른 주목할 점은 네임 스페이스에 문제가 있다는 것입니다. 메서드는 "com.btmatthews.mars"로 매핑되고 "com.btmatthews.minerva"에 대한 오류가 발생합니다. – giladbu
값을 "="가져 오는 것은 아무런 차이가 없지만 테스트를 거친 후 동일한 URL 매핑이 등록되었으므로 어쨌든 제거 할 것입니다. 포털 구성 요소의 패키지 이름은 com.btmatthews.mars이지만 그 위에 빌드 된 응용 프로그램은 com.btmatthews.minerva ....에 패키지되어 있습니다. 그 혼란은 있지만 문제는 아닙니다. –
내가 볼 수있는 유일한 가능성은 잘못된 DispatcherServlet의 ''입니다. 이 구성의 경우 '/ url-pattern>'이어야합니다. –
axtavt