@RestController 与 @RequestMapping

今天又踩到一个烂坑,记录一下。

今天在写一个服务时,明明 request 的 url 没有问题,可就是服务掉不通。下面我来还原下我的坑:

代码如下:

package com.simonton.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController("/demo")
public class DemoController {

	@RequestMapping("/hello")
	public String hello() {
		System.out.println("hello...");
		return "hello String... ";
	}
}

服务启动后,然后访问 /demo/hello 会显示404失败

分析:

    明眼人一看,就知道是在controller类配置上出问题了, @restController("/demo") 配置的意思是当前的controller,spring会将其加载成一个具有@ResponseBody 能力的 controller,且该controller的 component 名为 “/demo”。

正确的配置应该是@RestContrller 和 @RequestMapping("/demo") 一起使用。

正确的代码如下:

package com.simonton.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/demo")
public class DemoController {

	@RequestMapping("/hello")
	public String hello() {
		System.out.println("hello...");
		return "hello String... ";
	}
}

  

总结:

    其实对于@RestController 的滥用以前就遇到过,这个问题再次卡住长达半个小时,事实证明了,写代码不用脑子是很恐怖的。

提问:

    对于 controller 层 @RestController 和 @RequestMapping 组合使用的概率极高。那么spring是否可以考虑组合这俩个annotation,出一个新的复合annotation,使之同时具备@Controller 和@RequestMapping的能力? 

猜你喜欢

转载自my.oschina.net/simonton/blog/1648792