nubes, 在 Vert.x 3之上,注释层

分享于 

13分钟阅读

GitHub

  繁體 雙語
Annotation layer on top of Vert.x 3
  • 源代码名称:nubes
  • 源代码网址:http://www.github.com/aesteve/nubes
  • nubes源代码文档
  • nubes源代码下载
  • Git URL:
    git://www.github.com/aesteve/nubes.git
    Git Clone代码到本地:
    git clone http://www.github.com/aesteve/nubes
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/aesteve/nubes
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    

    不幸的是,这个项目依赖于旧版本的Vert.x. 升级到 Vert.x 3.5需要大量工作,我看它是一个"周末"项目。 对不起,不便,显然会有任何帮助。 感谢你的理解。

    如果你觉得你想要帮助,任何拉请求都是非常受欢迎的。 你也可以 fork,并开始自己的工作,以自己的视觉,这样的注释框架将适合你的需要。 许可证允许你这样做。

    你可以开始分叉,改变 Vert.x 依赖到 3.5让它编译( 需要一些工作),然后运行测试( 有一个很好的代码覆盖),然后从那里开始修复东西。 这也许是最好的帮助。

    Vert.x Nubes

    在vertx站点顶部提供注释层。

    用带注释的方法和控制器来声明你的Vert.x 路由,在 spring。

    repositories {
     jcenter()
    }
    dependencies {
     compile 'com.github.aesteve:nubes:1.3'}

    声明性声明

    Nubes在运行时自动注入方法参数,以便以声明方式表达你的路由。 通过读取该方法的签名,你应该能够在路由使用( 查询参数,请求正文。)的情况下使用 Glimpse 生成(。void => 状态 204,对象=> 已经被调度)。

    public PeanutsCharacter get(@Param CharacterType type) 让我们知道方法使用名为 type的请求参数,并且响应将包含一个经过整理的PeanutsCharacter POJO。

    Nubes带有一个控制器层,也有一个服务层。 可以将服务声明为简单 pojo,并在控制器中注入,也可以将服务声明为异步。

    插件可以扩展

    这个框架被设计为完全可以扩展,以便你可以使用自己的注释,无论它是拦截器,还是类型适配器,等等。

    如何扩展框架的一个好例子是 Nubes Mongo,一组旨在帮助你在上处理Mongo的additionnal实用工具( 注释,拦截器。)。 例如 Nubes Mongo针对Nubes框架注册 @Create 注释,这意味着该方法的结果应该保存在Mongo数据库中。

    基本上,注释将绑定到一组在执行'路线'方法之前和/或者之后执行的处理程序集。

    非阻塞( 明显明显),也非 stumble

    尽管Nubes看起来 opinionated ( 以单一方式声明你的路由: 控制器/方法方法),请记住,vertx网站的路由器仍然存在,如果你发现自己卡住了 Nubes。 这样,你永远也不会成为 stucked。

    如果你有一套额外的实用程序,可以用另一种方式声明网络路由,如果你没有可以处理的DI框架,或者用不同的方式编写,那么就可以声明并注入服务。

    在控制器中,Router 也可以作为一个简单的字段注入,在运行时很容易处理,如果需要的话,可以在运行时进行。

    示例

    ( 正在进行中)

    If Nubes,bridge,bridge,bridge,bridge,bridge,bridge,bridge,bridge,bridge,bridge,bridge,shows,shows,shows,shows,,。 在这里之上,它使用MongoDB作为持久存储,这样你就可以获得服务层的一个好视图。

    的基本示例:

    控制器:

    packagecom.peanuts.controllers;@Controller("/peanuts")publicclassPeanutsPages {
     publicENUMCharacterType {
     DOG, GIRL, BOY, BIRD;
     }
     @GET("/character")
     @ViewpublicStringgetCharacter(@ContextDataMap<String, Object>data, @ParamCharacterTypetype) {
     switch(type) {
     caseDOG: 
     data.put("name", "Snoopy");
     break;
     caseBOY: data.put("name", "Charlie Brown");
     break;
     //.. . }
     return"character.hbs";
     }
    }

    视图:

    web/views/character.hbs

    <html>
     <body>
     Hello, I'm a Peanuts character, and my name is {{name}}
     </body>
    </html>

    GET"/peanuts/character?type=DOG" 将返回以下html视图:

    Hello, I'm a Peanuts character, and my name is Snoopy

    一个 JSON api示例

    packagecom.peanuts.controllers;@Controller("/api/1/peanuts")@ContentType("application/json")publicclassCharactersController {
     @Service("mongo")
     privateMongoService mongo;
     @GET("/character")
     publicPeanutsCharactergetCharacter(@ParamCharacterTypetype) {
     switch(type) {
     caseDOG: 
     returnnewPeanutsCharacter(CharacterType.DOG, "Snoopy", snoopysBirthDate);
     // etc.  }
     }
     @POST("/character") // declaring RoutingContext as parameter means your method is asyncpublicvoidcreateCharacter(RoutingContextcontext, @RequestBodyPeanutsCharactercharacter) {
     mongo.save(character, handler -> {
     context.next(); 
     }); // save it using JDBC service, mongo service, hibernate service, etc. }
    }

    使用域对象的示例:

    packagecom.peanuts.model;publicclassPeanutsCharacter {
     publicENUMCharacterType {
     DOG, GIRL, BOY, BIRD;
     }
     privateCharacterType type;
     privateString name;
     privateDate birthDate;
     // getters, setters, constructors and stuff}

    GET"/api/1/peanuts/characters?type=DOG" 包含 application/jsonAccept header 将返回:

    {
     "name":"Snoopy",
     "type":"DOG",
     "birthDate":"1950-11-04T08:00:00.000Z"}

    具有以下请求主体的POST"/api/1/peanuts/characters":

    {
     "name":"Snoopy",
     "type":"DOG",
     "birthDate":"1950-11-04T08:00:00.000Z"}

    将我们最喜欢的卡通狗保存到数据库中,然后返回一个 HTTP 204.

    工作原理

    VertxNubes作为入口点

    框架的入口点是 creatning,它是 VertxNubes 实例。

    你将注意到构造函数采用两个参数:

    • Vertx实例
    • 包含配置的JsonObject

    请看一下的配置文档,对于可用的。强制的或者不需要的选项。

    创建VertxNubes实例后,需要对它的进行 bootstrap 操作。 它要做的是扫描应用程序类( 带 @Controller 注释),以创建 approriate Web路由/处理程序并将它的附加到 vertx Web Router

    如果你想在标准的vertx路径中添加定制的路由和内容,你可以提供自己的Router

    你还可以让 VertxNubes instanciate Router。 它将会在启动完成后返回给你。 你可以用它做任何你需要做的事情。

    VertxNubes nubes =newVertxNubes(vertx, config);
    nubes.bootstrap(res -> {
     if (res.succeeded()) {
     Router yourRouter = res.result();
     System.out.println("Everything's ready");
     } else {
     System.err.println("Something went wrong");
     res.cause().printStackTrace();
     }
    });

    你将在项目的测试中找到大量示例。

    如果看一下模拟控制器,你会发现所有的事情都可以用Nubes完成。

    控制器层

    什么是 @Controller

    控制器是定义一组方法的Java singleton ( 每个Nubes实例),它将被转换为 vertx-web处理器。 ( ~= express中间件)。

    控制器定义无参数构造函数是很重要的,VertxNubes期望。

    在控制器中,你可以找到路由,带有 @GET@POST@PUT,- -。 但也有两种不同类型的过滤器: @BeforeFilter@AfterFilter

    对于控制器中的每个路由,在执行筛选之前,在实际的路由方法之前,以及筛选器之后,好。 后。

    注释

    Nubes提供了一些缺省注释。 这里是

    但是,你也可以定义自己的注释,并将 vertx-web处理程序附加到它。

    这种情况下,你可以在调用之后调用什么Nubes调用将调用的"。注释处理器"。

    Nubes本身使用这个API注册自己的注释。 例如 @ContentType({"application/json","application/xml"}) 注释绑定到一个 ContentTypeProcessor,该将:

    • 检查请求的Accept header,如果它与处理的MIME类型不匹配,则将 406状态返回给客户端
    • Accept header 中指定的客户端和 ContentType 注释正文中指定的客户端中找到最合适的MIME。
    • 在RoutingContext中将这里ContentType作为变量插入,这样你也可以从中受益
    • 定位 Content-Type 响应 header,这样你就不必关心它

    读取注释文档

    参数

    在运行时,根据请求( 参数,主体,。)的上下文,参数会自动注入到每个方法中。

    有关可用参数( 默认情况)的完整列表,请参见参数文档

    但是,你也可以通过告诉nubes来 register 自己的参数解析器: ,当你找到这种类型的参数时,就像这样解决它"。

    参数可以通过它的类型( 如果方法要求 Nubes,那么就是这样注入 RoutingContext 或者 EventBus 参数的) 或者定义的自定义注释来解析。

    读取参数注入文档。

    视图层

    TODO: 解释模板引擎是由用户创建的,并绑定到文件扩展名。 然后,如何通过 @View("viewName.extension") 或者通过 ViewResolver 参数解析视图。

    服务层

    在Nubes中使用的服务是简单的pojo,使用 nubes.registerService(String name, Object serviceInstance) 这样,你就可以使用 @Service("someName") 注释从控制器访问它们。

    标准服务

    任何POJO都可以是一个服务。 只需将它与进行比较即可。

    异步服务

    在某些情况下,服务需要花费时间来启动或者关闭。 如果希望在Nubes引导时启动服务,只需实现 Nubes Service 接口和 register,就可以使用与使用POJO相同的方法来实现服务。

    RPC和服务代理

    TODO: 解释如何使用vertx代理的服务。

    SockJS

    Nubes提供了一种简单的方法来声明带有注释的SockJS处理程序,而不是在vertx站点中定义的处理程序。

    例如要处理传入套接字,你可以执行以下操作。

    @SockJS("/sockjs/*")publicclassSockJSController {
     @OnMessagepublicvoidonMessage(SockJSSocketemitter, Buffermessage) {
     emitter.write(Buffer.buffer(message)); // simply echo the message back }
    }

    如果希望用户使用SockJS从客户端访问某些地址,也可以使用vertx网络桥上的事件总线。

    @EventBusBridge("/sockjs/*")@InboundPermitted("some-allowed-address")publicclassBridgeController {
     @SOCKET_CREATEDpublicvoidwhenSocketIsCreated(BridgeEventevent) {
     // do what you want... }
     @REGISTERpublicvoidwhenSomeUserRegisters(BridgeEventevent) {
     // do what you want... }
    }

    Layer  ann  annotation  
    相关文章