2015-01-16 4 views
1

В моей весне контроллере, я пытаюсь получить переменные 3 путь:пружинных переменного множественным пути

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

К сожалению, это не будет признан сервлетом.

Существуют способы связывания URI, например.
@RequestMapping("**/catalogue"), а также @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") 
}  

Спасибо за помощь.

+0

Просьба предоставить больше контекста, то есть класс контроллера '' @ RequestMapping' и другие методы '@Reque stMapping. –

+0

@Controller @RequestMapping ("xyz") – Noctem

+2

Как насчет ошибки? Когда это происходит? Получаете ли вы ответ 404 с весны, когда вы отправляете запрос, или это то, что приложение не удалось запустить? –

ответ

0

Это может быть ошибка (исправлено весной 4.1): выйдите SPR-6741.

Как описано в этом вопросе, у вас есть в том же контроллере:

  • отображение с 3 пути переменных
  • "запасной вариант" картографирования /**
1

Попробуйте это. Не забывайте ("lang") в объявлении переменного пути в вашем параметре метода

@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

Прежде всего, Вы пропускаете / (слэш) в конце xyz в диспетчерских @RequestMapping (или в / в то начало каждого метода @RequestMapping). Это основная причина, по которой ваш метод с тремя переменными пути является никогда не вызывается.

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

Однако, как только вы решите это, я думаю, у вас может возникнуть другая проблема. Согласно Spring DOCS (ссылка 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. 
}