为什么“@PathVariable”无法在SpringBoot中的接口上工作

简单的应用程序 – Application.java

package hello; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 

简单的界面 – ThingApi.java

 package hello; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; public interface ThingApi { // get a vendor @RequestMapping(value = "/vendor/{vendorName}", method = RequestMethod.GET) String getContact(@PathVariable String vendorName); } 

简单的控制器 – ThingController.java

 package hello; import org.springframework.web.bind.annotation.RestController; @RestController public class ThingController implements ThingApi { @Override public String getContact(String vendorName) { System.out.println("Got: " + vendorName); return "Hello " + vendorName; } } 

使用您最喜欢的SpringBoot starter-parent运行它。 用GET / vendor / foobar命中它,你会看到:Hello null

Spring认为’vendorName’是一个查询参数!

如果使用未实现接口的版本替换控制器并将注释移动到其中,如下所示:

 package hello; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController public class ThingController { @RequestMapping(value = "/vendor/{vendorName}", method = RequestMethod.GET) public String getContact(@PathVariable String vendorName) { System.out.println("Got: " + vendorName); return "Hello " + vendorName; } } 

它工作正常。

这是一个function吗? 还是个bug?

您刚刚错过了@PathVariable中的@PathVariable

 @Override public String getContact(@PathVariable String vendorName) { System.out.println("Got: " + vendorName); return "Hello " + vendorName; }