6

私のSpringコントローラーでは、3つのパス変数を取得しようとしています:

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

残念ながら、これはサーブレットによって認識されません。


@RequestMapping("**/catalogue")URIをバインドする方法はいくつかあります@RequestMapping("{language}/{country}/catalogue")

コントローラー自体も特定のパスにマップされます。

パス変数に制限はありますか? 他のワイルドカードを使用することは可能ですか (たとえば@RequestMapping("**"))、より高く評価されますか?たとえば、2 つのワイルドカードは 3 つの定義された値よりも具体的です。ただし、ワイルドカードは実際には最後の一致オプションにする必要があります。

表示されるエラーについて:
まず、ワイルドカード マッピングを使用すると、それらが一致します。ワイルドカード マッピングを無効にすると、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")
}    

手伝ってくれてありがとう。

4

5 に答える 5

1

これはバグである可能性があります (Spring 4.1 で修正済み): SPR-6741を確認してください。

問題で説明されているように、同じコントローラーに次のものがあります。

  • 3 つのパス変数によるマッピング
  • 「フォールバック」マッピング/**
于 2015-01-17T09:56:14.677 に答える
0

まず第一に、コントローラーの の最後に(またはすべてのメソッドの の先頭にある/) (スラッシュ)がありません。これが、3 パス変数メソッドが呼び出されない主な理由です。xyz@RequestMapping/@RequestMapping

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

ただし、それを解決すると、別の問題が発生する可能性があると思います。Spring docs (ここにリンク) によると:

URL が複数のパターンに一致する場合、最も具体的な一致を見つけるために並べ替えが使用されます。

URI 変数とワイルドカードの数が少ないパターンは、より具体的であると見なされます。

これは、ワイルドカード マッチングを有効にする/と、コントローラーの の最後にを追加したとしても@RequestMapping、3 つのパス変数メソッドが呼び出されないことを意味します。これは、ワイルドカードを使用した方が Spring によってより具体的であると見なされるためです。

@RequestMappingスラッシュがないか、すべての s を確認してください。常にスラッシュで始めることをお勧めします。これにより、コード内の URL マッピングを簡単に区別できます。

于 2015-01-16T18:08:02.713 に答える
-2

これを試して:

@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.
}
于 2016-12-17T15:07:58.127 に答える