- TargetController.java
存在一个 foo 接口的 TargetController,该接口最初不可以被访问,后将被动态注册入 mvc 容器
动态注入的 foo 接口的 uri 路径为 /test/foo ,method 为 post , 返回一个 Foo JSON
public class TargetController {
public static class Foo{
private String name="foo";
public String getName(){return name;}
}
@ResponseBody
public Foo foo() {
return new Foo();
}
}
- TestController.java
动态注册,让 foo 接口动态注入入 mvc 容器
@RestController
@RequestMapping("/test")
public class TestController{
@PostMapping("/addFooApi")
public String dynamicRegistFoo() throws NoSuchMethodException {
RequestMappingInfo build = RequestMappingInfo.paths("/test/foo")
.methods(RequestMethod.POST)
.consumes(MediaType.APPLICATION_JSON_VALUE)
.produces(MediaType.APPLICATION_JSON_VALUE)
.build();
Method meth = TargetController.class.getMethod("foo");
// SpringContextUtil 是封装好实现了 ApplicationContextAware 接口的从 spring 上下文中获取实例的工具类
// 此处不写该类实现
RequestMappingHandlerMapping handlerMapping = SpringContextUtil.getBean(RequestMappingHandlerMapping.class);
handlerMapping.registerMapping(build, new TargetController(), meth);
return "OK";
}
}
- 测试
启动 Application , 访问 /test/foo ,接口返回 404,后访问 /test/addFooApi 动态注册接口,返回 OK,再访问 /test/foo ,接口返回 {"name":"foo"},代表动态注册接口成功
- 参考
RequestMappingHandlerMapping registerMapping not binding with RequestBody / HttpEntity
本文由 ONE 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
如有版权疑问交流,请给我留言:oneisall8955@gmail.com
本文永久链接:http://liuzhicong.cn/index.php/study/springboot-dynamic-add-api.html
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
如有版权疑问交流,请给我留言:oneisall8955@gmail.com
本文永久链接:http://liuzhicong.cn/index.php/study/springboot-dynamic-add-api.html