前言
最近了解到了vertx这个异步框架,但平时用的比较多的还是spring,出于好奇,尝试基于vertx web去实现spring mvc风格注解。
最终效果如下所示
@Slf4j
@RestController
public class HelloController {
@RequestMapping("hello/world")
public String helloWorld() {
return "Hello world and nintha veladder";
}
@RequestMapping("echo")
public Map echo(String message, Long token, int code, RoutingContext ctx) {
log.info("uri={}", ctx.request().absoluteURI());
log.info("message={}, token={}, code={}", message, token, code);
HashMap map = new HashMap<>();
map.put("message", message);
map.put("token", token);
map.put("code", code);
return map;
}
@RequestMapping(value = "hello/array")
public List> helloArray(long[] ids, String[] names, RoutingContext ctx) {
log.info("ids={}", Arrays.toString(ids));
log.info("names={}", Arrays.toString(names));
return ctx.request().params().entries();
}
@RequestMapping("query/list")
public List> queryArray(List ids, TreeSet names, LinkedList rawList, RoutingContext ctx) {
log.info("ids={}", ids);
log.info("names={}", names);
log.info("rawList={}", rawList);
return ctx.request().params().entries();
}
@RequestMapping("query/bean")
public BeanReq queryBean(BeanReq req) {
log.info("req={}", req);
return req;
}
@RequestMapping(value = "post/body", method = HttpMethod.POST)
public BeanReq postRequestBody(@RequestBody BeanReq req) {
log.info("req={}", req);
return req;
}
}
@RestContoller
现在主流spring mvc的控制器一般是使用@RestController注解,它的主要作用是告诉框架这个类是请求控制器,让框架主动扫描并加载这个类。
这个注解本质是个标记注解,所以目前不需要其他字段。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface RestController {
}
由于目前没有实现任何DI(依赖注入),为了方便我们直接在代码里面手动创建实例并加载。
@Override
public void start() throws Exception {
HttpServer server = vertx.createHttpServer();
Router router = Router.router(vertx);
routerMapping(new HelloController(), router);
server.requestHandler(router).listen(port, ar -> {