Java Spring引导:多个@RequestMapping方法不';t在嵌入式Tomcat中工作

Java Spring引导:多个@RequestMapping方法不';t在嵌入式Tomcat中工作,java,rest,tomcat,spring-boot,Java,Rest,Tomcat,Spring Boot,我遇到一个问题,即公共基本路径周围的多个@RequestMappings无法按预期工作 我定义了一个类级映射,如下所示: @RestController @RequestMapping( "/we/just/want/to" ) public class DoitController 使用以下方法映射 @RequestMapping( path = "/doit", method = RequestMethod.GET ) public ResponseEntity<String>

我遇到一个问题,即公共基本路径周围的多个
@RequestMappings
无法按预期工作

我定义了一个类级映射,如下所示:

@RestController
@RequestMapping( "/we/just/want/to" )
public class DoitController
使用以下方法映射

@RequestMapping( path = "/doit", method = RequestMethod.GET )
public ResponseEntity<String> doitUsingQueryParams(
    @RequestParam( name = "abc", required = false ) String abc,
    @RequestParam( name = "def", required = false ) String def,
    HttpServletRequest request ) throws Exception
{
    ...
}

@RequestMapping( path = "/doit/{abc}", method = RequestMethod.GET )
public ResponseEntity<String> doitWithAbc(
        @PathVariable String abc,
        HttpServletRequest request ) throws Exception
{
    ...
}

@RequestMapping( path = "/doit/{abc}/{def}", method = RequestMethod.GET )
public ResponseEntity<String> doitWithAbcAndDef(
        @PathVariable String abc,
        @PathVariable String def,
        HttpServletRequest request ) throws Exception
{
    ...
}
找不到请求映射(访问日志显示请求返回404)。但是运行具有路径和查询字符串的请求如下

/we/just/want/to/doit?abc=theabcvalue 
/we/just/want/to/doit?abc=theabcvalue&def=thedefvalue
找到并正确映射到指定的方法

我不知道我在这方面做了什么,我真的很感激提供的任何帮助

更新-2017年1月27日星期五16:01:21 UTC

有趣的是,这段代码仅在Unix服务器上作为可执行jar运行时出现问题。在本地Windows7笔记本电脑上运行Eclipse时,每个方法都会正确执行。以下是我们服务器的详细信息:

CentOS release 6.7 (Final)  
Linux <server_name_removed> 2.6.32-573.12.1.el6.x86_64 #1 SMP Tue Dec 15 21:19:08 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
CentOS 6.7版(最终版)
Linux 2.6.32-573.12.1.el6.x86_64#1 SMP周二12月15日21:19:08 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
java版本“1.8.0_45”
Java(TM)SE运行时环境(build 1.8.0_45-b14)
Java HotSpot(TM)64位服务器虚拟机(构建25.45-b02,混合模式)
还要注意,请求映射确实出现在日志文件输出中:

15:53:04,548 t=1485532384 tn=548000000 pid=2520 h=xx.xx.xx.110 lynx f=org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping l=534 lvl=INFO : Mapped "{[/we/just/want/to/doit],methods=[GET]}" onto public org.springframework.http.ResponseEntity<java.lang.String> com.xxxxxx.lynx.DoitController.doitUsingQueryParams(java.lang.String,java.lang.String,javax.servlet.http.HttpServletRequest) throws java.lang.Exception
15:53:04,548 t=1485532384 tn=548000000 pid=2520 h=xx.xx.xx.110 lynx f=org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping l=534 lvl=INFO : Mapped "{[/we/just/want/to/doit/{abc}],methods=[GET]}" onto public org.springframework.http.ResponseEntity<java.lang.String> com.xxxxxx.lynx.DoitController.doitWithAbc(java.lang.String,javax.servlet.http.HttpServletRequest) throws java.lang.Exception
15:53:04,549 t=1485532384 tn=549000000 pid=2520 h=xx.xx.xx.110 lynx f=org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping l=534 lvl=INFO : Mapped "{[/we/just/want/to/doit/{abc}/{def}],methods=[GET]}" onto public org.springframework.http.ResponseEntity<java.lang.String> com.xxxxxx.lynx.DoitController.doitWithAbcAndDef(java.lang.String,java.lang.String,javax.servlet.http.HttpServletRequest) throws java.lang.Exception
15:53:04548 t=1485532384 tn=548000000 pid=2520 h=xx.xx.xx.110 lynx f=org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping l=534 lvl=INFO:Mapped“{[/we/just/want/to/doit],methods=[GET]}”到public.springframework.http.ResponseEntity.com.xxxxxx.lynx.DoitController.DoitController.doitsingQueryParams上(java.lang.String、java.lang.String、javax.servlet.http.HttpServletRequest)抛出java.lang.Exception
15:53:04548 t=1485532384 tn=548000000 pid=2520 h=xx.xx.xx.110 lynx f=org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping l=534 lvl=INFO:Mapped“{[/we/just/want/to/doit/{abc}],methods=[GET]}”到public org.springframework.http.responseEntitycom.xxxxxx.lynx.DoitController.DoitController.doitWithAbc(java.lang.String、javax.servlet.http.HttpServletRequest)抛出java.lang.Exception
15:53:04549 t=1485532384 tn=549000000 pid=2520 h=xx.xx.xx.110 lynx f=org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping l=534 lvl=INFO:Mapped“{[/we/just/want/to/doit/{abc}/{def}],methods=[GET]}”到public org.springframework.http.responseentEntity.com.xxxxxx.lynx.DoitController.DoitController.doithabcanddef}”上(java.lang.String、java.lang.String、javax.servlet.http.HttpServletRequest)抛出java.lang.Exception

请注意,您可以在现代Spring中使用
@GetMapping
,这样做会简单得多,如果可能的话,您应该避免传入请求对象。这看起来应该可以正常工作。请打开
org.springframework.web
的日志记录,调试并发布它在启动时打印的映射列表。我只是想检查您的实现。一切正常。1)检查上下文路径。2)检查控制器是否在
@ComponentScan
范围内。请记住,您始终可以使用Springs MockMvc对控制器方法进行单元测试。请参阅此处接受的答案,以获取示例@chrylis无需打开日志来调试以查看映射,默认级别(INFO)已经足够了。但这是第一件需要检查的事情。请注意,您可以在现代Spring中使用
@GetMapping
,这样做会简单得多,如果可能的话,您应该避免传递请求对象。这看起来应该可以正常工作。请打开
org.springframework.web
的日志来调试和发布列表它在启动时打印的映射。我刚刚测试了您的实现。一切正常。1)检查您的上下文路径。2) 检查控制器是否完全在
@ComponentScan
范围内。请记住,您始终可以使用Springs MockMvc对控制器方法进行单元测试。请参阅此处接受的答案以获取示例@chrylis。无需打开日志来调试即可查看映射,默认级别(INFO)就足够了。但这确实是第一件要检查的事情。
15:53:04,548 t=1485532384 tn=548000000 pid=2520 h=xx.xx.xx.110 lynx f=org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping l=534 lvl=INFO : Mapped "{[/we/just/want/to/doit],methods=[GET]}" onto public org.springframework.http.ResponseEntity<java.lang.String> com.xxxxxx.lynx.DoitController.doitUsingQueryParams(java.lang.String,java.lang.String,javax.servlet.http.HttpServletRequest) throws java.lang.Exception
15:53:04,548 t=1485532384 tn=548000000 pid=2520 h=xx.xx.xx.110 lynx f=org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping l=534 lvl=INFO : Mapped "{[/we/just/want/to/doit/{abc}],methods=[GET]}" onto public org.springframework.http.ResponseEntity<java.lang.String> com.xxxxxx.lynx.DoitController.doitWithAbc(java.lang.String,javax.servlet.http.HttpServletRequest) throws java.lang.Exception
15:53:04,549 t=1485532384 tn=549000000 pid=2520 h=xx.xx.xx.110 lynx f=org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping l=534 lvl=INFO : Mapped "{[/we/just/want/to/doit/{abc}/{def}],methods=[GET]}" onto public org.springframework.http.ResponseEntity<java.lang.String> com.xxxxxx.lynx.DoitController.doitWithAbcAndDef(java.lang.String,java.lang.String,javax.servlet.http.HttpServletRequest) throws java.lang.Exception