Rapidoid - Extremely Fast, Simple and Powerful Java Web Framework and HTTP Server!

Overview

Rapidoid - Simple. Powerful. Secure. Fast!

Rapidoid is an extremely fast HTTP server and modern Java web framework / application container, with a strong focus on high productivity and high performance.

Documentation, examples, community support

Please visit the official site:

http://www.rapidoid.org/

Apache License v2

Rapidoid is released under the liberal Apache Public License v2, so it is free to use for both commercial and non-commercial projects.

Roadmap

  • Better documentation (work in progress - as always)
  • Swagger / OpenAPI support

Contributing

  1. Fork (and then git clone https://github.com/<your-username-here>/rapidoid.git).
  2. Make your changes
  3. Commit your changes (git commit -am "Description of contribution").
  4. Push to GitHub (git push).
  5. Open a Pull Request.
  6. Please sign the CLA.
  7. Thank you for your contribution! Wait for a response...
Issues
  • Bad request on '..' in GET query parameter

    Bad request on '..' in GET query parameter

    Going to a valid route with a query parameter that has ".." in it will result in a bad request even though it's completely valid.

    For example, http://localhost:8888/Auth?code=test.. will fail with a bad request, while http://localhost:8888/Auth?code=test. will properly route. The handler in question was registered with On.get("/Auth").plain(new ReqRespHandler() { ... etc. The error is coming from this segment of code, https://github.com/rapidoid/rapidoid/blob/933fc5003295a0f121243856e9a0263ddb200a34/rapidoid-buffer/src/main/java/org/rapidoid/bytes/BytesUtil.java#L571.

    Unfortunately, a google api I'm using returns a token with '..' present in the string. When using google oauth, the redirect link gets passed a get parameter that has somekey=abcdabcd..abcda& in it. Therefore, I would consider this a bug on Rapidoid's part as that's a valid URL. The fix would involve removing the if statement causing the fail and updating the corresponding tests associated with '..' not being valid.

    bug fixed & released 
    opened by mooman219 12
  • Extend transaction context to include serialization

    Extend transaction context to include serialization

    Returning a JPA entity containing a collection of referenced entities as JSON from a transactional request will fail during serialization if the collection is loaded lazy (which is the default).

    The reason is that the entity is not fully instantiated when the handler method returns, and the JPA lazy load will happen only on serialization. But it seems that rapidoid closes the transaction before serializing the results, so Hibernate throws a LazyInitializationException.

    stacktrace.txt

    bug fixed & released 
    opened by bokesan 11
  • Rapidoid crashes when processing requests that use Transfer-Encoding.

    Rapidoid crashes when processing requests that use Transfer-Encoding.

    Ok, so after an hour or two of smashing my face against this problem, it's a bit of a doozy...

    I've written a shitty http client that can send Multipart POST requests to a server. The server I was using to test against was Rapidoid, as it's insanely easy to do anything. (Props for that).

    The library I'm writing uses the new Java 11 HttpClient, and as far as I can tell, the problem doesn't lie with that.

    The problem:

    ERROR | 05/Jan/2019 19:27:03:122 | server1 | org.rapidoid.net.impl.RapidoidWorker | Failed to process message! | error = java.lang.RuntimeException: Error in the response order control! Expected handle: 1, real: 0
    java.lang.RuntimeException: Error in the response order control! Expected handle: 1, real: 0
    	at org.rapidoid.u.U.rte(U.java:423)
    	at org.rapidoid.u.U.rte(U.java:435)
    	at org.rapidoid.net.impl.RapidoidConnection.processedSeq(RapidoidConnection.java:276)
    	at org.rapidoid.net.impl.RapidoidWorker.processNext(RapidoidWorker.java:281)
    	at org.rapidoid.net.impl.RapidoidWorker.processMsgs(RapidoidWorker.java:216)
    	at org.rapidoid.net.impl.RapidoidWorker.process(RapidoidWorker.java:208)
    	at org.rapidoid.net.impl.RapidoidWorker.readOP(RapidoidWorker.java:159)
    	at org.rapidoid.net.impl.AbstractEventLoop.processKey(AbstractEventLoop.java:93)
    	at org.rapidoid.net.impl.AbstractEventLoop.insideLoop(AbstractEventLoop.java:146)
    	at org.rapidoid.net.impl.AbstractLoop.run(AbstractLoop.java:71)
    	at org.rapidoid.net.impl.RapidoidWorkerThread.run(RapidoidWorkerThread.java:58)
    

    An attempt to describe said problem:

    After poking it for a bit, I've determined that the HttpManagedHandlerDecorator promotes the connection to async, when it shouldn't.
    But it does so in an alternating fashion.

    So, I chunk up the request, because, well, that's a good thing to do.
    When the first chunk comes through, rapidoid processes it without issue.
    As it was processing the first chunk, the connection seems to be set to sync, and it tells the connection that the seq 0 was handled.

    The problem arises when the next seq is handled.
    For some reason, HttpManagedHandlerDecorator sets it to async:

    Breakpoint reached
    	  at org.rapidoid.net.impl.RapidoidConnection.async(RapidoidConnection.java:490)
    	  at org.rapidoid.http.handler.HttpManagedHandlerDecorator.handle(HttpManagedHandlerDecorator.java:63)
    	  at org.rapidoid.http.handler.AbstractDecoratingHttpHandler.handle(AbstractDecoratingHttpHandler.java:55)
    	  at org.rapidoid.http.FastHttp.handleIfFound(FastHttp.java:285)
    	  at org.rapidoid.http.FastHttp.onRequest(FastHttp.java:136)
    	  at org.rapidoid.http.FastHttpProtocol.process(FastHttpProtocol.java:59)
    	  at org.rapidoid.net.impl.RapidoidWorker.processNext(RapidoidWorker.java:271)
    	  at org.rapidoid.net.impl.RapidoidWorker.processMsgs(RapidoidWorker.java:216)
    	  at org.rapidoid.net.impl.RapidoidWorker.process(RapidoidWorker.java:208)
    	  at org.rapidoid.net.impl.RapidoidWorker.readOP(RapidoidWorker.java:159)
    	  at org.rapidoid.net.impl.AbstractEventLoop.processKey(AbstractEventLoop.java:93)
    	  at org.rapidoid.net.impl.AbstractEventLoop.insideLoop(AbstractEventLoop.java:146)
    	  at org.rapidoid.net.impl.AbstractLoop.run(AbstractLoop.java:71)
    	  at org.rapidoid.net.impl.RapidoidWorkerThread.run(RapidoidWorkerThread.java:58)
    

    So the connection is now marked as async, and the RapidoidWorker checks if the current request is async, if so, it doesn't care, and continues processing.

    Meanwhile, it sets it back to sync, so when the second chunk comes in, the connection errors out, because
    it was marked as sync, and as a result, tries to tell the connection that seq 2 was handled, but the
    connection was never informed about seq 1, so it throws the error.

    Beyond that, I have no idea.
    If this wall of text helps in some way, awesome.
    Otherwise I'm fine answering any questions you might have.

    The client I've written isn't public yet, but I'd be happy to give you the code to take a look.

    bug 
    opened by Jezza 9
  • Which files need to be hosted?

    Which files need to be hosted?

    Hello @nmihajlovski ,

    I am the member of cdnjs project. We want to host this library. But there is a question want to ask. I want to confirm with you about the main file need to be grab on github. Are the main files all under assets/rapidoid/ this folder?(rapidoid-extras.css and rapidoid-extras.js) And are there any other dependency files needed to be grab? Please help me confirm this. Thanks for your help!

    https://github.com/cdnjs/cdnjs/issues/8398

    opened by kennynaoh 9
  • java.lang.NullPointerException on rapid request issuing

    java.lang.NullPointerException on rapid request issuing

    when I issue multiple requests at the same time (roughly) say press the refresh button in the browser in rapid succession I am seeing this stacktrace in the console:

    ERROR | pool-1-thread-7 | org.rapidoid.job.ContextPreservingJobWrapper | Job execution failed! | message=null java.lang.NullPointerException at org.rapidoid.net.impl.RapidoidWorker.close(RapidoidWorker.java:261) at org.rapidoid.net.impl.RapidoidWorker.close(RapidoidWorker.java:256) at org.rapidoid.net.impl.RapidoidConnection.close(RapidoidConnection.java:229) at org.rapidoid.net.impl.RapidoidConnection.close(RapidoidConnection.java:276) at org.rapidoid.net.impl.RapidoidConnection.closeIf(RapidoidConnection.java:283) at org.rapidoid.net.impl.RapidoidConnection.closeIf(RapidoidConnection.java:45) at org.rapidoid.http.fast.FastHttp.done(FastHttp.java:458) at org.rapidoid.http.fast.ReqImpl.finish(ReqImpl.java:516) at org.rapidoid.http.fast.ReqImpl.onDone(ReqImpl.java:430) at org.rapidoid.http.fast.ReqImpl.done(ReqImpl.java:414) at org.rapidoid.http.fast.handler.AbstractAsyncHttpHandler.complete(AbstractAsyncHttpHandler.java:205) at org.rapidoid.http.fast.handler.AbstractAsyncHttpHandler$1.run(AbstractAsyncHttpHandler.java:128) at org.rapidoid.job.ContextPreservingJobWrapper.run(ContextPreservingJobWrapper.java:62) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Exception in thread "pool-1-thread-7" java.lang.RuntimeException: Job execution failed! at org.rapidoid.u.U.rte(U.java:560) at org.rapidoid.job.ContextPreservingJobWrapper.run(ContextPreservingJobWrapper.java:65) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.NullPointerException at org.rapidoid.net.impl.RapidoidWorker.close(RapidoidWorker.java:261) at org.rapidoid.net.impl.RapidoidWorker.close(RapidoidWorker.java:256) at org.rapidoid.net.impl.RapidoidConnection.close(RapidoidConnection.java:229) at org.rapidoid.net.impl.RapidoidConnection.close(RapidoidConnection.java:276) at org.rapidoid.net.impl.RapidoidConnection.closeIf(RapidoidConnection.java:283) at org.rapidoid.net.impl.RapidoidConnection.closeIf(RapidoidConnection.java:45) at org.rapidoid.http.fast.FastHttp.done(FastHttp.java:458) at org.rapidoid.http.fast.ReqImpl.finish(ReqImpl.java:516) at org.rapidoid.http.fast.ReqImpl.onDone(ReqImpl.java:430) at org.rapidoid.http.fast.ReqImpl.done(ReqImpl.java:414) at org.rapidoid.http.fast.handler.AbstractAsyncHttpHandler.complete(AbstractAsyncHttpHandler.java:205) at org.rapidoid.http.fast.handler.AbstractAsyncHttpHandler$1.run(AbstractAsyncHttpHandler.java:128) at org.rapidoid.job.ContextPreservingJobWrapper.run(ContextPreservingJobWrapper.java:62) ... 3 more

    The reply seems to arrive just fine in the browser but I am wondering if this behavior is caused by my handler or an actual bug in the server.

    Thanks !

    bug 
    opened by cosminbasca 9
  • Cannot run after using Gradle to build jar file.

    Cannot run after using Gradle to build jar file.

    question 
    opened by doggie1989 8
  • XML response support

    XML response support

    This will be good for porting to rapidoid on legacy systems.

    released feature request hacktoberfest 
    opened by ferrerojosh 7
  • HTTPS Support

    HTTPS Support

    At first glance the one thing that would prevent me from using this today is the lack of HTTPS support. The framework looks really promising and I think adding HTTPS support would encourage others to start to use the framework.

    released feature request implemented 
    opened by rpmoore 7
  • Hot reloading of changed classes

    Hot reloading of changed classes

    enhancement 
    opened by nmihajlovski 7
  • Ability to convert IllegalArgumentException as an HTTP 400 (Bad Request) response

    Ability to convert IllegalArgumentException as an HTTP 400 (Bad Request) response

    Currently, if we return null from a controller, the response is automatically translated to a 404 not found which is very convenient. However for any thrown errors, the response is converted to a 500 internal server error.

    However, when designing a REST API, it is very common that we want to return a 400 Bad Request because the client request parameters are invalid.

    It would be more useful if we could simply throw an IllegalArgumentException and have that exception translated to a 400 Bad Request response.

    Maybe there is a convenient mechanism for handling this but I looked at all the documentation and the examples and couldn't find any clues on how to implement this is a nice way.

    bug 
    opened by picaron 7
  • Video/Media Upgrade

    Video/Media Upgrade

    Currently, when serving large media, buffer space is an issue and leads some browsers (typically on mobile) unable to load the content for playback. Also, on Chrome, you are unable to scrub through the content compared to Apache's Web Server.

    It would be a nice feature to have this looked into.

    opened by LandyLane 0
  • Add additional documentation and examples for HTML rendering

    Add additional documentation and examples for HTML rendering

    There does not appear to be a lot of documentation for HTML rendering.

    Need more documentation and ideally a repo that contains fully working examples of how to set up and use the HTML rendering functionality.

    opened by danuvian 1
  • On.page().mvc() error

    On.page().mvc() error

    I am trying to copy your examples for displaying an HTML page and I am getting an error.

    I have code like this:

    On.page("/hi").mvc("Hello world!");

    And I have a "hi.html" file in resources/templates.

    11:32:10.236 [executor1] ERROR o.r.h.impl.lowlevel.LowLevelHttpIO - Error occurred when handling request! | error = java.lang.RuntimeException: Error while retrieving view: hi java.lang.RuntimeException: Error while retrieving view: hi at org.rapidoid.u.U.rte(U.java:427) at org.rapidoid.http.impl.ResponseRenderer.renderView(ResponseRenderer.java:117) at org.rapidoid.http.impl.ResponseRenderer.renderMvc(ResponseRenderer.java:57) at org.rapidoid.http.impl.BodyRenderer.createRespBodyFromResult(BodyRenderer.java:67) at org.rapidoid.http.impl.BodyRenderer.toRespBody(BodyRenderer.java:41) at org.rapidoid.http.impl.ReqImpl.renderResponse(ReqImpl.java:569) at org.rapidoid.http.impl.ReqImpl.renderResponseOrError(ReqImpl.java:549) at org.rapidoid.http.impl.ReqImpl.onDone(ReqImpl.java:524) at org.rapidoid.http.impl.ReqImpl.done(ReqImpl.java:510) at org.rapidoid.http.handler.HttpManagedHandlerDecorator.processNormalResult(HttpManagedHandlerDecorator.java:232) at org.rapidoid.http.handler.HttpManagedHandlerDecorator.complete(HttpManagedHandlerDecorator.java:223) at org.rapidoid.http.handler.HttpManagedHandlerDecorator.handleWithWrappers(HttpManagedHandlerDecorator.java:109) at org.rapidoid.http.handler.HttpManagedHandlerDecorator.access$200(HttpManagedHandlerDecorator.java:39) at org.rapidoid.http.handler.HttpManagedHandlerDecorator$2.run(HttpManagedHandlerDecorator.java:83) at org.rapidoid.job.PredefinedContextJobWrapper.run(PredefinedContextJobWrapper.java:56) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: java.lang.RuntimeException: Couldn't recalculate the cache value! at org.rapidoid.u.U.rte(U.java:427) at org.rapidoid.cache.impl.ConcurrentCacheAtom.retrieveCachedValue(ConcurrentCacheAtom.java:163) at org.rapidoid.cache.impl.ConcurrentCacheAtom.get(ConcurrentCacheAtom.java:64) at org.rapidoid.cache.impl.ConcurrentCache.get(ConcurrentCache.java:175) at org.rapidoid.render.RapidoidTemplateFactory.load(RapidoidTemplateFactory.java:66) at org.rapidoid.http.customize.defaults.DefaultViewResolver.getView(DefaultViewResolver.java:49) at org.rapidoid.http.impl.ResponseRenderer.renderView(ResponseRenderer.java:115) ... 16 more Caused by: java.lang.RuntimeException: at org.rapidoid.u.U.rte(U.java:427) at org.rapidoid.u.U.rte(U.java:431) at org.rapidoid.render.TemplateCompiler.compile(TemplateCompiler.java:49) at org.rapidoid.render.XNode.compile(XNode.java:63) at org.rapidoid.render.XNode.compile(XNode.java:67) at org.rapidoid.render.RapidoidTemplateFactory.loadTemplate(RapidoidTemplateFactory.java:83) at org.rapidoid.render.RapidoidTemplateFactory.loadAndCompile(RapidoidTemplateFactory.java:40) at org.rapidoid.render.RapidoidTemplateFactory$1.map(RapidoidTemplateFactory.java:54) at org.rapidoid.render.RapidoidTemplateFactory$1.map(RapidoidTemplateFactory.java:51) at org.rapidoid.cache.impl.ConcurrentCacheAtom.retrieveCachedValue(ConcurrentCacheAtom.java:130) ... 21 more Caused by: javassist.NotFoundException: org.rapidoid.render.TemplateRenderer at javassist.ClassPool.get(ClassPool.java:450) at org.rapidoid.render.TemplateCompiler.tryToCompile(TemplateCompiler.java:60) at org.rapidoid.render.TemplateCompiler.compile(TemplateCompiler.java:46) ... 28 more

    opened by danuvian 0
  • More setup details are required for https

    More setup details are required for https

    Hi Https is more important nowadays. The docs is so limited and not enough example.

    I tried to add config.yml in /app/config.yml but the https is not live in test.

    Need some helps here.

    Thanks a lot!

    opened by HotGameCoder 1
  • Please Support HTTP/2 Server Push

    Please Support HTTP/2 Server Push

    I love the speed and performance of Rapidoid, but there would be even greater speed/performance gains if Rapidoid started supporting HTTP/2 push. The majority of users have a browser that supports HTTP/2, so it's time to do it. Here are the features that would need to be implemented:

    • Auto-discovery of HTTP/2: https://http2.github.io/http2-spec/#discover-https
    • boolean supportsHttpPush() and int getHttpVersion() methods on the Resp (https://www.rapidoid.org/docs.html#_the_http_api) class. Currently, supportsHttpPush() will return true when getHttpVersion() is 2, and getHttpVersion() returns 0 for HTTP/1.0, 1 for HTTP/1.1, and 2 for HTTP/2 right now.
    • Resp appendPushPromise(Resp other) appends another Resp onto the HTTP/2 promise frame if the request is HTTP/2 and returns other.

    That's all that you need to implement to help us make our websites many many times faster than they already are. Some things down the road to implement:

    • HPACK header compression: https://blog.cloudflare.com/hpack-the-silent-killer-feature-of-http-2/
    • Caching the HPACK headers

    HTTP/3 will come with some additional enhancements that build ontop of HTTP/2 that you can worry about later (if ever at all). The upgrade from HTTP/1.1 to HTTP/2 is enormous for performance, whereas the upgrade from HTTP/2 to HTTP/3 will not be as dazzling. Nevertheless, you may want to look into HTTP/3 eventually as it will take quite a lot of burden off the server via intelligent caching.

    opened by anonyco 0
  • New release for updated dependencies?

    New release for updated dependencies?

    Hey, I was just about to make a ticket about updating some of the dependencies, because 5.5.5 seems to be pulling in some old versions of a lot of libraries, but I noticed that a lot of the libraries have been updated already, it's just waiting on a release.

    Could we get a 5.5.6?

    I'm currently blocked on a bug from Jackson 2.8.5, and it was fixed in the later versions.

    Many thanks. :)

    opened by Jezza 1
  • Allow declaring a common root for routes.

    Allow declaring a common root for routes.

    It would be cool if we could, when declaring routes, specify a context for a given set of routes.

    It's not annoying per se, but it would be nice to see some structure.

    On.context("/context", () -> {
        On.get("/thing1").json(...);
        On.get("/thing2").json(...);
    })
    
    opened by Jezza 1
  • Allow configuring Controller's routes.

    Allow configuring Controller's routes.

    Currently, we can only configure a route for a Controller via Annotations.

    The annotations themselves aren't the problem, but rather that not all options are available/configurable. Introducing every option as an annotation would be crazy, and borderline unmaintainable. It would also be annoying if we need to specify a bunch of these annotations for a lot the routes.

    I think a good solution would be allow us to specify a map, or a method, and add an annotation that either calls the method, or pulls the config from the map.

    It would also be great if we could configure it for the Controller itself, because there are some options that I'd want to configure for all routes, but only a couple of options for a couple of specific routes.

    I'd be happy to help out and submit a PR, if you approve of this idea or even have a better one.

    One good example is the managed option. I'm doing a lot of custom request processing, and decided to use controllers, because they allow declaring a context, but the downside is that I can't control the options directly. I can see someone already opened an issue because of this. #182

    opened by Jezza 0
  • How to start only JPA?

    How to start only JPA?

    Hello!

    I tried to use JPA.bootstrap(args);

    This takes 7+ seconds on my pc, but App run with web and jpa takes 4 secs.

    opened by ArthurHarkivsky 0
  • running Rapidoid from JUnit - exception when handling async response

    running Rapidoid from JUnit - exception when handling async response

    Hi!

    When running rapidoid from JUnit (4 or 5) I'm getting following error for async requests. Sync handling works fine. Exception happens when calling done() method:

    2019-08-13/21:07:49.230/EEST [Thread-9] ERROR o.r.h.impl.lowlevel.LowLevelHttpIO - Error occurred when handling request! | error = java.lang.IllegalArgumentException: The customization request (POST /syncAdminApi/v1/users) doesn't match the context request (null)!
    java.lang.IllegalArgumentException: The customization request (POST /syncAdminApi/v1/users) doesn't match the context request (null)!
        at org.rapidoid.u.U.illegal(U.java:443)
        at org.rapidoid.u.U.must(U.java:476)
        at org.rapidoid.http.customize.Customization.inValidContext(Customization.java:130)
        at org.rapidoid.http.customize.Customization.of(Customization.java:121)
        at org.rapidoid.http.impl.BodyRenderer.mediaResponseRenderer(BodyRenderer.java:91)
        at org.rapidoid.http.impl.BodyRenderer.resultToRespBody(BodyRenderer.java:85)
        at org.rapidoid.http.impl.BodyRenderer.createRespBodyFromResult(BodyRenderer.java:75)
        at org.rapidoid.http.impl.BodyRenderer.toRespBody(BodyRenderer.java:41)
        at org.rapidoid.http.impl.ReqImpl.renderResponse(ReqImpl.java:569)
        at org.rapidoid.http.impl.ReqImpl.renderResponseOrError(ReqImpl.java:549)
        at org.rapidoid.http.impl.ReqImpl.onDone(ReqImpl.java:524)
        at org.rapidoid.http.impl.ReqImpl.done(ReqImpl.java:510)
        at org.rapidoid.http.impl.RespImpl.done(RespImpl.java:294)
        ...
    

    How I do async processing in the code:

    in rapidoid handler thread:

    1. Resp resp = req.async()
    2. ... publish resp to processing pipeline...
    3. return resp

    later from another thread:

    1. resp.code(..)
    2. resp.json(..)
    3. resp.done()

    When running as standalone application, above approach works fine.

    I have noticed that startup log is different when starting rapidoid from the junit, for some reason main=null:

    INFO  org.rapidoid.setup.App - Inferred application root | main = null | package = com.package.my
    

    Many thanks!

    opened by mzheravin 0
Releases(5.1.0)
  • 5.1.0(May 13, 2016)

    • automatic hot reload after code changes,
    • lambdas as handlers - with named and type-safe parameters,
    • URI path patterns (simple and regex-based),
    • Admin Center for convenient management of the deployed app,
    • JVM and OS metrics in the Admin Center,
    • info about the web app routes in the Admin Center,
    • role-based web security with out-of-the-box login / logout,
    • configuration info in the Admin Center,
    • configuration profiles,
    • improved dependency injection (with profile support),
    • easy JPA bootstrap with TX management and nice utils like JPA.insert(new Foo()),
    • redesigned and enhanced JDBC utils,
    • scaffolding of JPA entities (RESTful services and management GUI),
    • new templating language and engine - similar to Mustache, but more practical,
    • highly customizable setup (serialization, security, error handling, template engine...),
    • many GUI enhancements...
    Source code(tar.gz)
    Source code(zip)
  • 5.0.0(Nov 8, 2015)

    • Major reorganization of the modules
    • Introduced clean API for the HTTP server
    • Introduced the Fluent module/framework
    • Improved the GUI components
    • Improved the API for the classpath scanner
    • Many bug fixes
    Source code(tar.gz)
    Source code(zip)
  • 4.1.0(Aug 14, 2015)

    • Replaced the Java-based page construction with Mustache templates
    • Added Cassandra-based implementation of the DB plugin (using the Datastax driver)
    • Included C3P0 for JDBC connection pooling for Hibernate and the simple SQL API
    • Added Micro-services support
    • Implemented caching of file resources, with reloading and change notifications
    • Added Jackson-based YAML parser utils
    • Added support for multi-threaded context spanning
    • Switched to async HTTP client
    • Implemented simple Watch service, notifying about file system changes (a simplification on top of Java NIO's watch service)
    • Introduced multi-app request routing
    • Improved transaction management
    • Simplified GUI pages (now defined by methods instead of classes)
    • Introduced more plugins Email, SMS, Templates etc
    • Added simple utils for scripting with JavaScript (Rhino or Nashorn)
    • Defined project resources layout ("dynamic", "static" and "templates" folders)
    • Added support for JavaScript-based RESTful services or dynamic pages using scripting
    • Simplified app configuration (App details, OAuth config etc.) using "app.yaml" configuration file
    • Simplified app menu construction using "menu.yaml" configuration file
    • Added even more cool utils in U (dynamic, mapOfMaps, mapOfLists, etc.)
    • Added support for multi-path resource trac
    • Improved the default CSS theme
    • Enhanced the error page
    • Improved the snippet widget
    • Simplified logging, re-based it on top of SLF4j, and included Logback by default
    • Introduced new context-aware job executor service with reference-counting clean-up
    Source code(tar.gz)
    Source code(zip)
  • rapidoid-4.0.1(Jul 5, 2015)

  • rapidoid-4.0.0(Jul 2, 2015)

    • Major changes in HTTP API (simplified and improved),
    • Added new small modules with utils for finer granularity,
    • Introduced "cookiepack" scope - stateless cookie-persisted session,
    • Introduced "local" scope - stateless page-local data persisted across ajax requests,
    • Refactored GUI widgets and state - using "local" view state,
    • Implemented more powerful classpath scanner (super-simple, no config required),
    • Replaced name-based with annotation-based component discovery mechanism,
    • Separated per-request transaction management through configurable AOP-style method interceptors,
    • Introduced JS and CSS library packs,
    • Many bug fixes.
    Source code(tar.gz)
    Source code(zip)
  • rapidoid-3.0.0(May 31, 2015)

    • Major redesign of many modules and components.
    • Separated the experimental X-modules from the main distribution.
    • De-coupled subsystems through plugin architecture (e.g DB plugin).
    • Introduced SQL module with a simple JDBC abstraction DSL.
    • Added built-in support for JPA (the default implementation of the DB plugin).
    • Replaced convention-based with annotation-based RESTful services.
    • Added module "Quick" for quick development (including JPA/Hibernate and H2 in-mem database).
    • Added new CSS utils and components.
    • Enhanced the default application look&feel.
    • Many bug fixes.
    Source code(tar.gz)
    Source code(zip)
  • rapidoid-2.4.0(May 31, 2015)

    • Added support for clean, empty pages (without navbar etc.)
    • Added simple debug widget
    • Improved AngularJS support
    • Introduced a card widget
    • Added multi-column support in stream widget
    • Introduced Dict data structure
    • Many bug fixes
    Source code(tar.gz)
    Source code(zip)
  • rapidoid-2.3.0(Mar 6, 2015)

    • Implemented generic HTTP protocol upgrade,
    • Implemented basic (incomplete) WebSocket server,
    • Introduced Rapidoid Query Language (RQL),
    • Simplified GUI widget construction,
    • Included AngularJS in the stack,
    • Added AngularJS-based Infinite Stream Widget,
    • Added Code Snippet widget,
    • Added Button widget,
    • Added support for all Font Awesome icons as constants,
    • Fixed several bugs.
    Source code(tar.gz)
    Source code(zip)
    rapidoid-2.3.0.jar(11.48 MB)
  • rapidoid-2.2.0(Feb 18, 2015)

    • Simplified the modeling of DB relations through domain model collections.
    • Enriched Entity model with "createdOn", "createdBy", "lastUpdatedOn" and "lastUpdatedBy" built-in properties.
    • Improved DSL for grid and panel widgets.
    • Introduced CanManage security annotation (insert/update/delete).
    • Improved security defaults.
    • Many minor bug fixes and small improvements.
    Source code(tar.gz)
    Source code(zip)
    rapidoid-2.2.0.jar(11.40 MB)
  • rapidoid-0.9.0(Feb 17, 2015)

  • rapidoid-1.0.0(Feb 17, 2015)

  • rapidoid-1.0.1(Feb 17, 2015)

  • rapidoid-2.0.0(Feb 17, 2015)

  • rapidoid-2.0.1(Feb 17, 2015)

  • rapidoid-2.0.2(Feb 17, 2015)

  • rapidoid-2.0.3(Feb 17, 2015)

  • rapidoid-2.1.0(Feb 17, 2015)

  • rapidoid-2.1.1(Feb 17, 2015)

Leading REST API framework for Java

Restlet Framework The leading REST API framework for Java Thanks to Restlet Framework's powerful routing and filtering capabilities, unified client an

Restlet Framework 618 Aug 29, 2021
Microserver is a Java 8 native, zero configuration, standards based, battle hardened library to run Java Rest Microservices via a standard Java main class. Supporting pure Microservice or Micro-monolith styles.

Microserver A convenient modular engine for Microservices. Microserver plugins offer seamless integration with Spring (core), Jersey, Guava, Tomcat, G

AOL 931 Aug 28, 2021
Library for OpenAPI 3 with spring-boot

Full documentation Acknowledgements springdoc-openapi is made possible thanks to all of its contributors. Introduction The springdoc-openapi Java libr

springdoc-openapi 1.4k Sep 16, 2021
Feign makes writing java http clients easier

Feign makes writing java http clients easier Feign is a Java to HTTP client binder inspired by Retrofit, JAXRS-2.0, and WebSocket. Feign's first goal

null 7.4k Sep 16, 2021
Feign makes writing java http clients easier

Feign makes writing java http clients easier Feign is a Java to HTTP client binder inspired by Retrofit, JAXRS-2.0, and WebSocket. Feign's first goal

null 6.8k Mar 13, 2021
A damn simple library for building production-ready RESTful web services.

Dropwizard Dropwizard is a sneaky way of making fast Java web applications. It's a little bit of opinionated glue code which bangs together a set of l

Dropwizard 8k Sep 14, 2021
Rest.li is a REST+JSON framework for building robust, scalable service architectures using dynamic discovery and simple asynchronous APIs.

Rest.li is an open source REST framework for building robust, scalable RESTful architectures using type-safe bindings and asynchronous, non-blocking I

LinkedIn 2.1k Sep 9, 2021
A simple http wrapper

HTTP Wrapper A Java 8 HTTP Wrapper Lib to deserialize the response! Explore the docs » Examples · Report Bug · Request Feature Getting Started This is

Diego Cardenas 13 Jul 22, 2021
Spring HATEOAS - Library to support implementing representations for hyper-text driven REST web services.

Spring HATEOAS This project provides some APIs to ease creating REST representations that follow the HATEOAS principle when working with Spring and es

Spring 938 Sep 10, 2021
Spring HATEOAS - Library to support implementing representations for hyper-text driven REST web services.

Spring HATEOAS This project provides some APIs to ease creating REST representations that follow the HATEOAS principle when working with Spring and es

Spring 920 Mar 8, 2021
Disable the 1.8x Click delay with this sleek API.

Tecknix Client Click Delay API A simple solution to remove Minecraft 1.8's click delay timer. Installation: Tecknix Click Delay API requires a Bukkit

Tecknix Client 3 Sep 7, 2021
A simple banking system written in Java used to teach object-oriented programming and best coding practices.

didactic-bank-application A simple banking system written in Java used to teach object-oriented programming and best coding practices. It is a three-l

Ingrid Nunes 23 Sep 4, 2021
Examples and server integrations for generating the Swagger API Specification, which enables easy access to your REST API

Swagger Core NOTE: If you're looking for Swagger Core 1.5.X and OpenAPI 2.0, please refer to 1.5 branch. NOTE: Since version 2.1.7 Swagger Core suppor

Swagger 6.8k Sep 14, 2021
A simple API wrapper for discords.com (alias botsfordiscord.com) written in Java.

Discords.com / BotsForDiscord.com Java Library A simple API wrapper for discords.com (alias botsfordiscord.com) written in Java 8. Installation This w

Dorian 3 Aug 6, 2021
Simple JSP Servlets REST api.

Simple JSP Servlets REST api.

MisterFunny01 3 May 9, 2021
JHipster is a development platform to quickly generate, develop, & deploy modern web applications & microservice architectures.

Greetings, Java Hipster! Full documentation and information is available on our website at https://www.jhipster.tech/ Please read our guidelines befor

JHipster 18.8k Sep 17, 2021
A type-safe HTTP client for Android and the JVM

Retrofit A type-safe HTTP client for Android and Java. For more information please see the website. Download Download the latest JAR or grab from Mave

Square 38.6k Sep 4, 2021
A Java API wrapper for the pastemyst api

Pastemyst.java What is pastemyst.java? pastemyst.java is a pastemyst API Wrapper, written in Java. The library is in early development, and all contri

YeffyCodeGit 12 Sep 17, 2021