2015-01-16 8 views
1

, 나는 3 경로 변수를 얻을려고 : 봄 여러 경로 변수 내 봄 컨트롤러에서

@RequestMapping("{language}/{country}/{term}/catalogue") - @PathVariable String language, @PathVariable String country, @PathVariable String term 

불행하게도이 서블릿에 의해 인식되지 않습니다.

URI를 바인딩 할 수있는 방법이 있습니다 (예 :
@RequestMapping("**/catalogue")@RequestMapping("{language}/{country}/catalogue")이 작동하지만 세 번째 경로 변수를 사용하면 작동이 중지됩니다.

컨트롤러 자체도 특정 경로에 매핑됩니다.

경로 변수에 대한 제한이 있습니까? ?는 3 개 정의 된 값보다 더 예를 들어 2 와일드 카드보다 구체적인 다른 와일드 카드 (예 : @RequestMapping("**")) 높은 평가 될 것입니다 가능하지만 와일드 카드는 실천의 마지막 일치하는 옵션한다

나타나는 오류에 대해서는 :..
첫째,과 . 와일드 카드 매핑, 그들은 내가 사용하지 않도록 설정하면 와일드 카드가 org.springframework.web.HttpRequestMethodNotSupportedException 오류가 발생합니다 매핑들과 일치한다

15:42:53,881 DEBUG [http-bio-18091-exec-31] (org.springframework.web.servlet.DispatcherServlet) - Handler execution resulted in exception - forwarding to resolved error view: ModelAndView: reference to view with name 'errors/exception'; model is null 
org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodResolver.resolveHandlerMethod(AnnotationMethodHandlerAdapter.java:665) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:431) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at [device detection filter] 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:722) 

컨트롤러 방법.

@RequestMapping(value = "{language}/{country}/{term}/catalogue", method = RequestMethod.GET) 
public ModelAndView catalogue(HttpServletRequest request, HttpServletResponse response, @PathVariable("language") String language, @PathVariable("country") String country, @PathVariable("term") String term, @RequestParam(value = "d", defaultValue = "") String device, @RequestParam(value = "embedded", defaultValue = "false") String embedded, @RequestParam(value = "id", defaultValue = "") String idString, @RequestParam(value = "nr", defaultValue = "") String nr) { 

로는 컨트롤러 (미안 해요, 난 여기 컨트롤러에서 전체 코드를 게시 할 수 없습니다)에서 모든 RequestMappings에게 여기에, 질문 있습니다 도움을

@Controller 
@RequestMapping("xyz/") 
public class Controller { 

@RequestMapping(value = "{language}/{country}/{term}/catalogue", method = RequestMethod.GET) 

@RequestMapping("**") 

@RequestMapping("{language}/{country}/product") 

@RequestMapping("{language}/{country}/product-detail") 

@RequestMapping("{language}/{country}/product-search") 

@RequestMapping("{language}/{country}/dealer-search") 

@RequestMapping("{language}/{country}/product-finder") 

@RequestMapping("{language}/{country}/table") 

@RequestMapping("**/languages") 

@RequestMapping("**/chooseLanguages") 
}  

감사합니다.

+0

컨트롤러 클래스 '@ RequestMapping' 및 기타 메소드'@Reque stMapping'이 관련되어 있습니다. –

+0

@Controller @RequestMapping ("xyz") – Noctem

+2

오류는 어떻게됩니까? 언제 발생합니까? 요청을 보낼 때 Spring으로부터 404 응답을 얻고 있습니까? 아니면 응용 프로그램이 시작되지 않았습니까? –

답변

0

버그 일 수 있습니다 (스프링 4.1에서 수정 됨). SPR-6741을 확인하십시오.이 문제에 설명한 바와 같이

, 당신은 동일한 컨트롤러에 있습니다

  • 3 개 경로 변수
  • 는 "대체"매핑 /**
1

시도해보십시오. 당신의 방법 매개 변수 모두의

@RequestMapping(value = "/{lang}/{count}/{term}", method=RequestMethod.GET) 
public ResponseEntity<?> getSomething(@PathVariable("lang") String lang, @PathVariable("count") String count, @PathVariable("term") String term) { 
+0

이것이 좋은 아이디어 인 이유와 OP가 이미 수행하고있는 것과 관련된 차이점을 설명 할 수 있습니까? "언어"가 경로 변수에 대한 좋은 이름이 아니라는 말입니까? –

0

처음에 경로 변수 선언에서 ("lang")를 잊지 마세요, 당신은 컨트롤러의 @RequestMapping (또는에서 /xyz의 끝에 / (슬래시)를 놓치고있어 모든 방법의 시작은 @RequestMapping입니다. 이것은 이 아닌이 호출 된 3 경로 변수 방법의 주된 이유입니다.

@RequestMapping(value = "{language}/{country}/{term}/catalogue", method = RequestMethod.GET) 

그러나 일단 문제를 해결하면 다른 문제가 발생할 수 있습니다. 봄 문서 (링크 here)에 따르면

When a URL matches multiple patterns, a sort is used to find the most specific match.

A pattern with a lower count of URI variables and wild cards is considered more specific.

이, 당신은 당신이 당신의 컨트롤러의 @RequestMapping의 끝에서 /을 추가 한 경우에도, 와일드 카드 매칭을 활성화하면, 당신의 3 경로 변수 메소드가 호출되지 않을 것이다 의미 왜냐하면 와일드 카드가있는 것은 스프링에 의해 더 구체적으로 간주되기 때문입니다.

슬래시가 누락되어 있는지 @RequestMapping에 모두 표시하십시오. 항상 슬래시로 시작하는 것이 좋습니다. 이렇게하면 코드에서 URL 매핑을 쉽게 구별 할 수 있습니다.

-1

와 매핑이 시도 :

@RequestMapping(value = "/{lang}/{count}/{term}", method=RequestMethod.GET) 
public ResponseEntity<?> getSomething(@PathVariable("lang") String lang, @PathVariable("count") String count, @PathVariable("term") String term) { 
    // Your code goes here. 
}