场景
- 今天在写垃圾代码的时候,发现公司的代码有一个baseController,还是个抽象类,还有很多baseController的具体子类,对baseController中的抽象方法进行重写覆盖,那么心中有个疑问,子类和父类的url是通过什么进行区分的??子类可不可以继承父类方法的url?作为一个实习生,初来乍到,心中充满好奇,写了个demo尝试一下。
demo
- 先写一个父类controller
@RestController
public class BaseController {
@GetMapping("/del")
public String base(){
return "base";
}
}
- 再写一个子类继承baseController
@RestController
@RequestMapping("/pre")
public class WangController extends BaseController {
@Override
@GetMapping("/del")
public String base() {
return "wang";
}
}
结果如下:
-
输入/pre/del的时候会来到子类的controller
-
输入/del 不带前缀的时候会来到父类的controller
子类重写方法能否继承父类的url
- 我们来看看:如果子类具体方法不带url,只加前缀,能否进行区分?
如果父类还是不变,但是子类像下面这样写↓
@RestController
@RequestMapping("/pre")
public class WangController extends BaseController {
@Override 不写方法具体的url,看看能否请求通
public String base() {
return "wang";
}
}
结果如下:
下面再来点骚操作~
如果子类继承了父类,但是没有重写该方法,会发生什么?
- 父类依旧是:
@RestController
public class BaseController {
@GetMapping("/del")
public String base(){
return "base";
}
}
- 这次子类并备有重写base方法
@RestController
@RequestMapping("/pre")
public class WangController extends BaseController {
}
那么当我们发送请求的时候:不管是加了前缀的/pre/del 还是不加前缀的/del,都会返回base!
原理就是:因为继承是可以继承到父类方法上的@GetMapping的,子类继承了方法,但是并没有进行重写,那么如果加了前缀发送请求的话,肯定是默认调用父类的方法来实现。
- 这就是我遇到的问题。。【这就是为什么我想要发送请求给子类,但是子类中并没有该url方法,debug发现,请求发到父类的url上了,但是父类的controller并没有前缀~】
结论
- 子类controller继承父类controller具体方法的时候,可以只通过前缀进行区分url
- 并且子类重写的父类的方法,如果url不改变,那么子类方法上的url可以不写(不写@GetMapping之类的…)