2014-02-18 3 views
0

내 REST 서버에 Spring MVC를 사용하고 있습니다. 내 pom.xml의 spring.version은 3.2.1.RELEASE입니다.spring mvc : 세 번째 경로 변수를 추가하자마자 리소스를 찾을 수 없습니다.

많은 RESTful API를 만들고 PathVariables를 광범위하게 사용했습니다. 그것은 잘 작동합니다.

하지만 다음과 같은 경우에 문제가있는 것으로 보입니다. 다음과 같은 경우 REST 요청에서 자원을 찾지 못합니다.

@Controller 
@RequestMapping(value = { "/resourceA/{resourceAId}/resourceB/{resourceBId}/resourceC/{resourceCId}" }) 
public class TenderController { 

    @RequestMapping(value = "", method = RequestMethod.POST) 
    @ResponseBody 
    public Tender capture(
     @PathVariable long resourceAId, 
     @PathVariable long resourceBId, 
     @PathVariable long resourceCId, 
     @RequestBody Map<String, Object> requestBody) { 

     ... 
    } 
} 

편집 : 여기

내 샘플이 실패 REST 요청 :

POST /resourceA/1/resourceB/2/resourceC/3 HTTP/1.1 
Host: localhost:8080 
Content-Type: application/json 
Cache-Control: no-cache 

{ "bodyParam1": 400, "bodyParam2": 0 } 

그러나, 나는 자바 코드에서 {resourceCId}을 삭제하고, 그에 따라 내 REST 요청을 조정하면 리소스를 성공적으로 찾습니다.

수정 된 Java 코드 :

@RequestMapping(value = { "/resourceA/{resourceAId}/resourceB/{resourceBId}/resourceC" }) 

뉴 (성공) REST 요청 :

POST /resourceA/1/resourceB/2/resourceC HTTP/1.1 
Host: localhost:8080 
Content-Type: application/json 
Cache-Control: no-cache 

{ "bodyParam1": 400, "bodyParam2": 0 } 

그래서 기본적으로 최대한 빨리 3 개 경로 변수를 가지고, 일이 무너져 버릴 것 같다. 여기에 무슨 일이 일어날 지에 대한 아이디어가 있습니까? 스프링 MVC 버그에 빠져 들었습니까? 왜냐하면 3 개의 경로 변수가 꽤 일반적인 시나리오 여야하기 때문입니다. (코너 케이스의 경우 거의 자격이 없을 것입니다.)

업데이트 : 내 서버 코드가 아닌 HTTP 클라이언트 (chrome postman)에 문제가있는 것 같습니다. 나는 컬을 통해 같은 요청을 보낼 때 예상 된 결과를 얻을 수있었습니다.

업데이트 : 실제로 오류가 발생하여 클라이언트 (우편 배달부, 말풍선 등)와 관계없이 오류가 발생했습니다. 따라서 확실히 서버 측 문제입니다. 여기에 로그 문제의 원인이 무엇을 찾을 수

01:35:39.409 [http-bio-8080-exec-5] DEBUG o.s.web.servlet.DispatcherServlet - DispatcherServlet with name 'mvc-dispatcher' processing POST request for [/resourceA/1/resourceB/1/resourceC/1] 
01:35:39.411 [http-bio-8080-exec-5] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Looking up handler method for path /resourceA/1/resourceB/1/resourceC/1 
01:35:39.414 [http-bio-8080-exec-5] DEBUG o.s.w.s.m.m.a.RequestMappingHandlerMapping - Returning handler method [public void com.sample.controller.DefaultController.unmappedRequest()] 
01:35:39.414 [http-bio-8080-exec-5] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'defaultController' 
01:35:39.422 [http-bio-8080-exec-5] DEBUG o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Resolving exception from handler [public void com.sample.controller.DefaultController.unmappedRequest()]: com.sample.exception.APIException: Url pattern is invalid. 
01:35:39.423 [http-bio-8080-exec-5] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'globalControllerExceptionHandler' 
01:35:39.423 [http-bio-8080-exec-5] DEBUG o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Invoking @ExceptionHandler method: public com.sample.model.ErrorInfo com.sample.controller.GlobalControllerExceptionHandler.handleAPIException(com.sample.exception.APIException) 
01:35:39.460 [http-bio-8080-exec-5] DEBUG o.s.w.s.m.m.a.RequestResponseBodyMethodProcessor - Written [[email protected]] as "application/json;charset=UTF-8" using [org.springf[email protected]2ae18b1a] 
01:35:39.460 [http-bio-8080-exec-5] DEBUG o.s.web.servlet.DispatcherServlet - Null ModelAndView returned to DispatcherServlet with name 'mvc-dispatcher': assuming HandlerAdapter completed request handling 
01:35:39.460 [http-bio-8080-exec-5] DEBUG o.s.web.servlet.DispatcherServlet - Successfully completed request 

은 다음과 같습니다
그래서 많은 다른 것들을 주위에 일 처리 후, 나는이 문제를 일으키는 것을 발견했습니다. 다른 컨트롤러와 일치하지 않는 모든 URL을 잡아 내 REST 서비스의 오류 응답에서 찾을 수없는 좋은 리소스를보고하기위한 DefaultController.java가 있습니다. DefaultController는 다음과 같은 코드를 가지고 있습니다 :

package com.sample.controller; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 

import com.sample.exception.APIException; 
import com.sample.exception.APIException.Code; 

@Controller 
public class DefaultController { 

    @RequestMapping("/**") 
    public void unmappedRequest() { 
     throw new APIException(Code.INVALID_URL_PATTERN, 
      "There is no resource for this path"); 
    } 
} 

이것은 잘되었습니다. 하지만이 경우 DefaultController "/ **"는 실제로 "/ resourceA/{resourceAId}/resourceB/{resourceBId}/resourceC/{resourceCId}"를 수신하도록 설정 한 컨트롤러 전에 내 URL을 선택했습니다. DefaultController 제거는 나를 위해 문제를 해결했습니다. 이제 내 질문은 내 TenderController 전에 트리거되는 않고 DefaultController 기능을 유지할 수 있습니다.

+0

404를 제공하지만이 방법으로 처리 할 것으로 기대되는 예제 URL을 표시하십시오. –

+0

REST 요청을 추가했습니다 (실패한 것뿐만 아니라 성공한 것). – Fayez

+0

그냥 재미를 위해 메소드의 RequestMapping에서'value = ""'를 제거하십시오. 그것은 변화를 가져 오지는 않겠지 만, 그렇지 않다고 항상 의미하는 것은 아닙니다. – digitaljoel

답변

0

아마도 이것은 어느 시점에서 수정 될 가능성이있는 스프링 버그 일 가능성이 높습니다. 정확히 같은 문제에 동참하십시오. 이 경우 맵핑되지 않은 요청을 처리하는 기본 스프링 컨트롤러를 일반 바닐라 서블릿으로 대체하여이 문제를 해결할 수있었습니다. 수행 방법에 대한 자세한 내용은 here입니다.

+0

에 오신 것을 환영합니다 stackoverflow, 귀하의 게시물에 대한 링크의 키포인트를 추가하십시오. –