The modular web framework for Java and Kotlin

Overview

Maven Central Javadoc Build Status Github Join the chat at https://gitter.im/jooby-project/jooby Become a Patreon Donate

∞ do more, more easily

Jooby is a modern, performant and easy to use web framework for Java and Kotlin built on top of your favorite web server.

Java:

import static org.jooby.Jooby.runApp;

public class App {

  public static void main(final String[] args) {
    runApp(args, app -> {
      app.get("/", ctx -> "Welcome to Jooby!");
    });
  }
}

Kotlin:

import org.jooby.runApp

fun main(args: Array<String>) {
  runApp(args) {
    get ("/") {
      "Welcome to Jooby!"
    }
  }
}

documentation

Documentation is available at https://jooby.io

help

Gitter

donate & support

1.x version

Documentation for 1.x is available at https://jooby.io/v1

Source code for 1.x is available at the 1.x branch

author

Edgar Espina

license

Apache License 2

Issues
  • APITool slows down startup drastically

    APITool slows down startup drastically

    The API tool is very good and useful for documentation, but is rarely accessed. Yet causes very slow start ups.

    With ApiTool:

    [2018-07-23 15:09:40,081]-[main] INFO c.z.s.App - [[email protected]]: Server started in 34232ms

    Without ApiTool:

    [2018-07-23 15:10:09,926]-[main] INFO c.z.s.App - [[email protected]]: Server started in 2860ms

    We looked into running the maven apitool but we can't configure it, and also has some issues.

    com.fasterxml.jackson.databind.JsonMappingException: Index: 0, Size: 0 (through reference chain: java.util.ArrayList[5]->org.jooby.apitool.RouteMethod["response"]->org.jooby.apitool.RouteResponse["type"])
    	at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:391)
    	at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:351)
    	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1711)
    	at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:290)
    	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
    	at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:136)
    	at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
    	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
    	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:286)
    	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
    	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:27)
    	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013)
    	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2985)
    	at org.jooby.internal.apitool.BytecodeRouteParser.read(BytecodeRouteParser.java:364)
    	at org.jooby.internal.apitool.BytecodeRouteParser.lambdas(BytecodeRouteParser.java:595)
    	at org.jooby.internal.apitool.BytecodeRouteParser.parse(BytecodeRouteParser.java:397)
    	at org.jooby.apitool.ApiParser.parse(ApiParser.java:295)
    	at org.jooby.apitool.ApiParser.parseFully(ApiParser.java:310)
    	at org.jooby.internal.apitool.APIProvider.<init>(APIProvider.java:225)
    	at org.jooby.internal.apitool.APIProvider$$FastClassByGuice$$9b325895.newInstance(<generated>)
    	at com.google.inject.internal.DefaultConstructionProxyFactory$FastClassProxy.newInstance(DefaultConstructionProxyFactory.java:89)
    	at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:114)
    	at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91)
    	at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:306)
    	at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:60)
    	at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
    	at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:148)
    	at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:39)
    	at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:211)
    	at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:182)
    	at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:109)
    	at com.google.inject.Guice.createInjector(Guice.java:87)
    	at com.google.inject.Guice.createInjector(Guice.java:78)
    	at org.jooby.Jooby.lambda$new$0(Jooby.java:885)
    	at org.jooby.Jooby.bootstrap(Jooby.java:2996)
    	at org.jooby.Jooby.start(Jooby.java:2197)
    	at org.jooby.Jooby.start(Jooby.java:2178)
    	at org.jooby.Jooby.run(Jooby.java:2107)
    	at co.zeekit.server.App.main(App.java:296)
    Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    	at java.util.ArrayList.rangeCheck(ArrayList.java:657)
    	at java.util.ArrayList.get(ArrayList.java:433)
    	at org.jooby.internal.apitool.TypeJsonDeserializer.deserialize(TypeJsonDeserializer.java:226)
    	at org.jooby.internal.apitool.TypeJsonDeserializer.deserialize(TypeJsonDeserializer.java:217)
    	at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:136)
    	at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
    	... 35 common frames omitted
    
    Process finished with exit code 130 (interrupted by signal 2: SIGINT)
    
    bug apitool 
    opened by aclowkey 26
  • jooby future

    jooby future

    jooby 2

    After a long consideration of existing implementation, ideas described in #926, evaluation of new frameworks (specially from Go but also http4k)... found some time to draw what and how Jooby 2 is going to look and work.

    As always, your feedback is welcome.

    design

    • Single Context object replaces Request and Response
    • Route Handler is now a function (returns a value)
    • Filter is now a function and they are not tied to a route pattern. They are group and composed using as functions
    • Route chain/pipeline replaced by functional filter
    • Run code in the IO Thread
    • Router algorithm now matches a single Handler. We can't add multiple handlers to same route
    • No more greedy Ant path pattern: **
    • There will be a clear difference between query, path and form parameters. Must get rid of the generic Request.param(String) method
    • Root package will be io.jooby
    • Remove DI/Guice from core

    contracts

    interface Context {
      //... merge of Request/Response objects from 1.x
    }
    
    interface Handler {
      Object apply(Context ctx);
    }
    
    interface Filter {
      Handler apply(Handler next);
    
      default Filter then(Filter next) {
        return h -> apply(next.apply(h));
      }
    
      default Handler then(Handler next) {
        return ctx -> apply(next).apply(ctx);
      }
    }
    
    interface Router {
    
      Handler match(String method, String path);
    
      //.. usual router methods
    }
    

    examples

    HelloWorld

    {
      get("/", ctx -> "Hello world!");
    }
    

    Nothing new, except we replaced the (Request, Response) signature by (Context)

    Filter

    {
      /** Timing filter: */
      filter(next -> {
        return ctx -> {
          long start = System.currentTimeMillis();
          Object response = next.apply(ctx);
          long end = System.currentTimeMillis();
          System.out.println("Took: " + (end - start));
          return response;
        };
      });
    
      get("/", ctx -> "Hello world!");
    }
    

    Here the timing filter applies to all the route defined bellow it.

    Filters are not tied to a path pattern anymore, the Route.Chain was replaced by a function composition.

    Scoped Filter

    {
      group(() -> {
        /** JWT auth filter: */
        filter(new JWTToken());
    
        get("/api/pets", ctx -> ...);
      });
    }
    

    Here the JWT filter applies to all the route defined below which are wrapped by group operator.

    unit tests

    As expected unit test will be easily to write due we use a functional approach:

    @Test
    public void easyTest() {
       Context ctx = mock();
       Router router = ...;
       Handler handler = router.match("/");
       Object response = handler.apply(ctx);
       assertEquals("Hello world!", response);
    }
    

    path pattern

    We are going to remove the greedy Ant path pattern, so patterns like:

    • '/foo/**'
    • '/foo/**/bar'

    won't work any more

    The new router algorithm will be a port of go-chi

    thread model

    We are going to keep the worker thread as default execution mode, also going to allow to execute a route in the IO thread:

    {
        mode(Mode.IO); // Default is WORKER
    
        worker(ForkJoinPool.commonPool()); // Set a default worker or Fallback to `server` worker executor
    
        get("/", ctx -> "from IO thread");
    
        dispatch(() -> {
          get("/default-worker", ctx -> "from worker thread"); // Run with default worker executor
        });
    
        dispatch(executor, () -> {
          get("/executor", ctx -> "from custom executor thread"); // Run with a custom executor
        });
    }
    

    Filters are going run properly (not like in 1.x where they are ignored #996)

    Just a quick preview of what is coming in 2.x

    As always, your feedback is welcome.

    help wanted feedback 
    opened by jknack 25
  • Failed joobyRun on Apple M1 Silicon

    Failed joobyRun on Apple M1 Silicon

    How can I resolve this?

    ✦ ➜ ./gradlew joobyRun
    > Task :kaptGenerateStubsKotlin UP-TO-DATE
    > Task :kaptKotlin UP-TO-DATE
    > Task :compileKotlin UP-TO-DATE
    > Task :compileJava NO-SOURCE
    > Task :processResources NO-SOURCE
    > Task :classes UP-TO-DATE
    > Task :joobyRun FAILED
    
    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Execution failed for task ':joobyRun'.
    > /Users/max/Library/Caches/JNA/temp/jna7013481395428920527.tmp: dlopen(/Users/max/Library/Caches/JNA/temp/jna7013481395428920527.tmp, 1): no suitable image found.  Did find:
      	/Users/max/Library/Caches/JNA/temp/jna7013481395428920527.tmp: no matching architecture in universal wrapper
      	/Users/max/Library/Caches/JNA/temp/jna7013481395428920527.tmp: no matching architecture in universal wrapper
    
    enhancement jooby:run 
    opened by eclecticlly 18
  • LiveReload does not work with Gradle Project

    LiveReload does not work with Gradle Project

    With gradle the LiveReload throws the following exception:

    C:\dev\sandbox\joobytest\my-app>gradlew joobyRun
    :compileJava UP-TO-DATE
    :processResources NO-SOURCE
    :classes UP-TO-DATE
    :joobyRun
    >>> jooby:run[info|Daemon worker Thread 2]: Hotswap available on: [C:\dev\sandbox\joobytest\my-app]
    >>> jooby:run[info|Daemon worker Thread 2]:   includes: [**/*.class;**/*.conf;**/*.properties;**/*.html]
    >>> jooby:run[info|Daemon worker Thread 2]:   excludes: []
    [2017-08-02 14:18:29,019]-[HotSwap] INFO  com.mycompany.App - Stopped
    [2017-08-02 14:18:29,024]-[HotSwap] ERROR com.mycompany.App - An error occurred while starting the application:
    com.google.inject.CreationException: Unable to create injector, see the following errors:
    
    1) No implementation for java.util.Set<org.jooby.filewatcher.FileEventOptions> was bound.
      while locating java.util.Set<org.jooby.filewatcher.FileEventOptions>
        for the 4th parameter of org.jooby.filewatcher.FileMonitor.<init>(FileMonitor.java:252)
      at org.jooby.filewatcher.FileWatcher.configure(FileWatcher.java:540)
    
    1 error
            at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:470)
            at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:155)
            at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:107)
            at com.google.inject.Guice.createInjector(Guice.java:99)
            at com.google.inject.Guice.createInjector(Guice.java:84)
            at org.jooby.Jooby.lambda$new$0(Jooby.java:884)
            at org.jooby.Jooby.bootstrap(Jooby.java:2948)
            at org.jooby.Jooby.start(Jooby.java:2161)
            at org.jooby.Jooby.start(Jooby.java:2142)
            at org.jooby.Jooby.run(Jooby.java:2072)
            at com.mycompany.App.main(App.java:20)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at org.jooby.run.Main.lambda$startApp$1(Main.java:427)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            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)
    >>> jooby:run[error|HotSwap]: com.mycompany.App.start() resulted in error
    java.lang.NullPointerException
            at org.jooby.run.Main.lambda$startApp$1(Main.java:432)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            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)
    

    Example Project: https://github.com/JStumpp/jooby-gradle-livereload

    bug gradle livereload 
    opened by JStumpp 18
  • Exception when using RAML with MVC Routes

    Exception when using RAML with MVC Routes

    Hello, check this out:

    I get this exception when I try to use the RAML module with MVC routes:

    java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.WildcardTypeImpl cannot be cast to java.lang.Class

    This is how I'm using:

    new Raml().install(this);

    I've also tried like this:

    new Raml().filter(routeSpec -> routeSpec.pattern().startsWith("/user")).install(this);

    To no avail.

    Do you know what I might be doing wrong?

    Thanks

    bug 
    opened by paulovictorv 17
  • Async Request Feature Request

    Async Request Feature Request

    No sure if I'm simply not finding it in the docs, but async request processing would be great. If Jooby had support for async and modules for ebean and akka I know a lot of folks that would be happy dropping the playframework.

    research feature 
    opened by noboomu 17
  • jooby2.x io.jooby.Usage: Router not found

    jooby2.x io.jooby.Usage: Router not found

    hello, I have set according to the documentation

    <plugin>
    			<artifactId>maven-compiler-plugin</artifactId>
    			<version>3.8.1</version>
    			<configuration>
    				<forceJavacCompilerUse>true</forceJavacCompilerUse>
    				<!-- 
    				<compilerArgs>
    					<arg>-parameters</arg>
    				</compilerArgs> 
    				-->
    				<annotationProcessorPaths>
    					<path>
    					    <groupId>org.projectlombok</groupId>
    					    <artifactId>lombok</artifactId>
    					    <version>1.18.12</version>
    					</path>
    					<path>
    						<groupId>io.jooby</groupId>
    						<artifactId>jooby-apt</artifactId>
    						<version>2.8.1</version>
    					</path>
    				</annotationProcessorPaths>
    			</configuration>
    		</plugin>
    		<plugin>
    			<groupId>io.jooby</groupId>
    			<artifactId>jooby-maven-plugin</artifactId>
    			<version>2.8.1</version>
    			<configuration>
    				<mainClass>${application.class}</mainClass>
    				<restartExtensions>conf,properties,class</restartExtensions>
    				<compileExtensions>java,kt</compileExtensions>
    				<port>8080</port>
    			</configuration>
    		</plugin>
    

    But after I modified the code Console output error

    io.jooby.Usage: Router not found: cn.ef.modules.sys.action.DownloadAct. Make sure Jooby annotation processor is configured properly. For more details, please visit: https://jooby.io/usage#annotation-processing-tool-router-not-found at io.jooby.Usage.apt (Usage.java:62) at io.jooby.Usage.mvcRouterNotFound (Usage.java:41) at io.jooby.Jooby.lambda$null$3 (Jooby.java:323) at java.util.Optional.orElseThrow (Optional.java:290) at io.jooby.Jooby.lambda$mvc$4 (Jooby.java:323) at java.util.Optional.orElseGet (Optional.java:267) at io.jooby.Jooby.mvc (Jooby.java:320) at io.jooby.Jooby.mvc (Jooby.java:310)

    bug 
    opened by j2eekingcn 17
  • Upgrade to pac4j v1.8

    Upgrade to pac4j v1.8

    We just released pac4j v1.8 and as Jooby uses it for authentication, it should be upgraded.

    pac4j v1.8 is a major version as it is now a full security engine and not only an authentication one for Facebook, Twitter...: it now supports REST/web services as well as authorizations. Which allows implementations (like jooby-pac4j) to become full security libraries. Configuration can now be handled at the pac4j level (-> https://github.com/pac4j/pac4j/tree/master/pac4j-core/src/main/java/org/pac4j/core/config) as well as profile storage (-> https://github.com/pac4j/pac4j/blob/master/pac4j-core/src/main/java/org/pac4j/core/profile/ProfileManager.java).

    The idea with pac4j v1.8 is not only to have implementations which are close, but to provide guidelines on how to implement pac4j and have the same algorithm implemented for all frameworks/tools, making evolutions and adoption easier.

    If you read: https://github.com/pac4j/pac4j,

    There are now two kinds of clients (= authentication mechanims):

    • indirect / stateful clients are for UI when the user authenticates once at an external provider (like Facebook, a CAS server...) or via a local form (or basic auth popup)
    • direct / stateless clients are for web services when credentials (like basic auth, tokens...) are passed for each HTTP request.

    To define your security configuration, gather all your authentication mechanisms = clients via the Clients class (to share the same callback url). Also define your authorizers to check authorizations and aggregate both (clients and authorizers) on the Config. Notice you may also use the ConfigSingleton object to keep one instance of your configuration and share it among the different components (if you don't have any dependency injection capability). You can also use the ConfigFactory to build you configuration if no other mean is available.

    To secure your Java web application, the reference implementation is to create two "filters": one to protect urls, the other one to receive callbacks for stateful authentication processes (indirect clients):

    1. For your protection "filter", it must be based on two String parameters: clientName (list of clients used for authentication) and authorizerName (list of authorizers to check authorizations) and use the following logic: loop on direct clients for authentication then check the user profile and authorizations
    2. For your callback "filter", get the credentials and the user profile on the callback url.

    We moved things really far as you can see that both implementations between J2E and Play for example are very very close: https://github.com/pac4j/j2e-pac4j/blob/master/src/main/java/org/pac4j/j2e/filter/RequiresAuthenticationFilter.java#L91 vs https://github.com/pac4j/play-pac4j/blob/master/play-pac4j-java/src/main/java/org/pac4j/play/java/RequiresAuthenticationAction.java#L95.

    Even the README are organized the same way with the same texts for common parts. The associated demos have been upgraded and that should be done for: https://github.com/pac4j/jooby-pac4j-demo as well. The README of the demo can be copy/pasted from the one for J2E and updated. There is even a specific logo for the jooby-pac4j implementation: https://pac4j.github.io/pac4j/img/logo-jooby.png which should appear at the top of the README demo and of the implementation documentation: http://jooby.org/doc/pac4j/

    If you have any question or need any help, don't hesitate.

    enhancement 
    opened by leleuj 16
  • V2 module grammar including multiple domains and a 'dir' idiom

    V2 module grammar including multiple domains and a 'dir' idiom

    It may actually be compatible/possible in the V1.2x codebase, but seeing as V2 is being designed here is what I'd love to see in Jooby:

    Demo of decomposition of Jooby application that includes 'domains' and 'directories'

    That demo's repo showing tracing output from the running of that representative Jooby application

    What the demo is showcasing is the nesting of directories and a Jooby app serving two domains (through a single 80/443 port):

    1. dir(..) and Dir is similar to the existing path, but implicitly directories are bounded by '/' chars in URLs.

    2. domain(..) and Domain are not currently modeled in Jooby.

    Another difference is that the instead of Runnable (as in path(str, Runnable)), there is JoobyComponent (would implement most of the methods of DSL Jooby today).

    feature 
    opened by paul-hammant 16
  • OpenAPI and routes operator

    OpenAPI and routes operator

    Again me bringing a OpenAPI issue (I have to apologize for it!)...

    It seems that when I have this: mvc(UserSettingsController())

    openAPI correctly parses and displays the results.

    However if I have this:

    routes {
            decorator(RequireRole(StaffRole, CustomerRole))
            mvc(UserSettingsController())
        }
    

    than openAPI will not show anything. The perpetrator here is the routes{} scoping. I need it since different routes have different decorators, but I also realized that removing it does give me my docs back.

    Maybe someone can help

    invalid openapi 
    opened by Flavsditz 15
  • [MVC] Annotations with array of annotations break annotation processor with UnsupportedOperationException

    [MVC] Annotations with array of annotations break annotation processor with UnsupportedOperationException

    If you have an annotation that has an array of annotations as arguments on an MVC method and you are using JDK 11 or higher the APT processor will fail with:

    Caused by: java.lang.UnsupportedOperationException
        at com.sun.tools.javac.code.Attribute.getValue (Attribute.java:58)
        at io.jooby.internal.apt.asm.RouteAttributesWriter.annotationValue (RouteAttributesWriter.java:196)
        at io.jooby.internal.apt.asm.RouteAttributesWriter.toMap (RouteAttributesWriter.java:184)
        at io.jooby.internal.apt.asm.RouteAttributesWriter.annotationMap (RouteAttributesWriter.java:172)
        at io.jooby.internal.apt.asm.RouteAttributesWriter.annotationValue (RouteAttributesWriter.java:198)
        at io.jooby.internal.apt.asm.RouteAttributesWriter.toMap (RouteAttributesWriter.java:184)
        at io.jooby.internal.apt.asm.RouteAttributesWriter.annotationMap (RouteAttributesWriter.java:172)
        at io.jooby.internal.apt.asm.RouteAttributesWriter.annotationMap (RouteAttributesWriter.java:143)
        at io.jooby.internal.apt.asm.RouteAttributesWriter.process (RouteAttributesWriter.java:121)
    

    An example annotation that fails is @Operation from Swagger.

    That being said this is kind of a JDK bug. I looked at the com.sun Attribute and all of its subclasses including Error implement getValue so it must be some weird synthetic class or a proxy.

    The JDK bug is here: https://bugs.openjdk.java.net/browse/JDK-8201314

    An easy workaround is to obviously catch that exception in RouteAttributesWriter.annotationValue and ignore it.

    Alternatively the visitor pattern can be used on the AnnotationValue to build an array of maps to represent the annotation but that is more work.

    opened by agentgt 6
  • Jobby 2.10 contains Netty with bugs

    Jobby 2.10 contains Netty with bugs

    The dependency io.netty:netty-codec-http:4.1.65.Final and older versions contains a bug with http multipart form requests giving random IndexOutOfBounds exceptions, explained and solved here: https://github.com/netty/netty/pull/11335

    Solution: Update Netty dependencies to newest available version

    opened by steintore 0
  • Bump aws-java-sdk-bom from 1.11.916 to 1.12.57

    Bump aws-java-sdk-bom from 1.11.916 to 1.12.57

    Bumps aws-java-sdk-bom from 1.11.916 to 1.12.57.

    Changelog

    Sourced from aws-java-sdk-bom's changelog.

    1.12.57 2021-08-27

    Amazon EMR

    • Features

      • Amazon EMR now supports auto-terminating idle EMR clusters. You can specify the idle timeout value when enabling auto-termination for both running and new clusters and Amazon EMR automatically terminates the cluster when idle timeout kicks in.

    Amazon Elastic Compute Cloud

    • Features

      • This release adds the BootMode flag to the ImportImage API and showing the detected BootMode of an ImportImage task.

    Amazon Simple Storage Service

    • Features

      • Documentation updates for Amazon S3.

    1.12.56 2021-08-26

    AWS Compute Optimizer

    • Features

      • Adds support for 1) the AWS Graviton (AWS_ARM64) recommendation preference for Amazon EC2 instance and Auto Scaling group recommendations, and 2) the ability to get the enrollment statuses for all member accounts of an organization.

    Amazon Elastic Compute Cloud

    • Features

      • Support added for resizing VPC prefix lists

    Amazon Rekognition

    • Features

      • This release added new attributes to Rekognition RecognizeCelebities and GetCelebrityInfo API operations.

    Amazon Transcribe Service

    • Features

      • This release adds support for batch transcription in six new languages - Afrikaans, Danish, Mandarin Chinese (Taiwan), New Zealand English, South African English, and Thai.

    1.12.55 2021-08-25

    AWS DataSync

    • Features

      • Added include filters to CreateTask and UpdateTask, and added exclude filters to StartTaskExecution, giving customers more granular control over how DataSync transfers files, folders, and objects.

    Amazon CloudWatch Events

    • Features

      • AWS CWEvents adds an enum of EXTERNAL for EcsParameters LaunchType for PutTargets API

    Amazon Elastic Compute Cloud

    • Features

      • Support added for IMDS IPv6 endpoint

    Amazon EventBridge

    • Features

      • AWS EventBridge adds an enum of EXTERNAL for EcsParameters LaunchType for PutTargets API

    Firewall Management Service

    • Features

      • AWS Firewall Manager now supports triggering resource cleanup workflow when account or resource goes out of policy scope for AWS WAF, Security group, AWS Network Firewall, and Amazon Route 53 Resolver DNS Firewall policies.

    ... (truncated)

    Commits
    • 8cb4262 AWS SDK for Java 1.12.57
    • ba67b97 Update GitHub version number to 1.12.57-SNAPSHOT
    • 63d30bb AWS SDK for Java 1.12.56
    • 2f88b99 Update GitHub version number to 1.12.56-SNAPSHOT
    • 1d50624 AWS SDK for Java 1.12.55
    • 73414d6 Update GitHub version number to 1.12.55-SNAPSHOT
    • 0539449 AWS SDK for Java 1.12.54
    • 36308ed Update GitHub version number to 1.12.54-SNAPSHOT
    • 787a07e AWS SDK for Java 1.12.53
    • d68f627 Update GitHub version number to 1.12.53-SNAPSHOT
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies java 
    opened by dependabot[bot] 0
  • Bump jsoup from 1.13.1 to 1.14.2 in /docs

    Bump jsoup from 1.13.1 to 1.14.2 in /docs

    Bumps jsoup from 1.13.1 to 1.14.2.

    Release notes

    Sourced from jsoup's releases.

    jsoup 1.14.2

    Caught by the fuzz! jsoup 1.14.2 is out now, and includes a set of parser bug fixes and improvements for handling rough HTML and XML, as identified by the Jazzer JVM fuzzer. This release also includes other fixes and improvements.

    See the release announcement for the full changelog.

    jsoup 1.14.1

    jsoup 1.14.1 is out now, with simple request session management, increased parse robustness, and a ton of other improvements, speed-ups, and bug fixes.

    See the full announcement for all the details on what's changed.

    Changelog

    Sourced from jsoup's changelog.

    jsoup changelog

    *** Release 1.14.2 [PENDING]

    • Improvement: support Pattern.quote \Q and \E escapes in the selector regex matchers. jhy/jsoup#1536

    • Improvement: Element.absUrl() now supports tel: URLs, and other URLs that are already absolute but that Java does not have input stream handlers for. jhy/jsoup#1610

    • Bugfix: when serializing output, escape characters that are in the < 0x20 range. This improves XML output compatibility, and makes HTML output with these characters easier to read (as they're otherwise invisible). jhy/jsoup#1556

    • Bugfix: the *|el wildcard namespace selector now also matches elements with no namespace. jhy/jsoup#1565

    • Bugfix: corrected a potential case of the parser input stream not being closed immediately on a read exception.

    • Bugfix: when making a HTTP POST, if the request write fails, make sure the connection is immediately cleaned up.

    • Bugfix: in the XML parser, XML processing instructions without attributes would be serialized as if they did. jhy/jsoup#770

    • Bugfix: updated the HtmlTreeParser resetInsertionMode to the current spec for supported elements. jhy/jsoup#1491

    • Bugfix: fixed an NPE when parsing fragment HTML into a standalone table element. jhy/jsoup#1603

    • Bugfix: fixed an NPE when parsing fragment heading HTML into a standalone p element. jhy/jsoup#1601

    • Bugfix: fixed an IOOB when parsing a formatting fragment into a standalone p element. jhy/jsoup#1602

    • Bugfix: tag names must start with an ascii-alpha character. jhy/jsoup#1006

    • Bugfix [Fuzz]: fixed a slow parse when a tag or an attribute name has thousands of null characters in it. jhy/jsoup#1580

    • Bugfix [Fuzz]: the adoption agency algorithm can have an incorrect bookmark position jhy/jsoup#1576

    • Bugfix [Fuzz]: malformed HTML could result in null elements on stack jhy/jsoup#1579

    • Bugfix [Fuzz]: malformed deeply nested table elements could create a stack overflow. jhy/jsoup#1577

    ... (truncated)

    Commits
    • 19c7732 [maven-release-plugin] prepare release jsoup-1.14.2
    • acde180 Compress harder
    • 530c5b0 Refactored fuzz tests to iterate all files in directory; run timeout tests
    • d2c455c Speed improvement: cap number of cloned active formatting elements
    • 0dcb53a Correctly consume to exit state
    • 42da864 In bogusComment, make sure unconsume not called after a potential buffer up
    • eba3e39 Fix an IOOB when HTML root cleared and then attributes added
    • 9d538e6 Annotate some nullables
    • a909600 Comment on URL normalization
    • 6b3ec64 Removed unused import
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the Security Alerts page.
    dependencies java 
    opened by dependabot[bot] 0
  • Make JackonsonModule able to support XML or JSON based on ACCEPT header -- proposed implementation attached.

    Make JackonsonModule able to support XML or JSON based on ACCEPT header -- proposed implementation attached.

    I know the module package is called "json", but it would be nice if users could supply both a json objectMapper and an xmlMapper to the jackson module. (This might also apply to the other json modules too) That would support the common use case where an endpoint can produce either xml or json, based on the Accept header on the request. The jooby GET annotation can already specify an array of formats that the endpoint can produce (i.e. you can already do @GET(produces = [MediaType.JSON, MediaType.XML]))

    The work around for this issue would be to manually create your Jackson mappers and do a check for the Accept header before returning the desired format yourself without using jooby's JacksonModule. At first glance, it looks like this wouldn't be terrible to integrate into Jooby and would allow users to do it the "jooby" way.

    Proposed: The following is the altered JacksonModule class I am proposing. It does work without changing the existing jackson module tests, but I would add a test for the xml case if you want me to submit a PR for this.

    public class JacksonModule implements Extension, MessageDecoder, MessageEncoder {
      private final Set<ObjectMapper> mappers;
    
      private final Set<Class<? extends Module>> modules = new HashSet<>();
    
      private final Map<String, ObjectMapper> mapperLookup = new HashMap<>();
    
      /**
       * Creates a Jackson module.
       *
       * @param mapper Object mapper to use.
       */
      public JacksonModule(@Nonnull Set<ObjectMapper> mappers) {
        this.mappers = mappers;
       
         // If none of the mappers are JsonMappers, include the default one 
         if (mappers.stream().filter(mapper -> mapper instanceof JsonMapper)
            .collect(Collectors.toList()).isEmpty()) {
            this.mappers.add(create());
        }
    
        mappers.forEach( mapper -> {
            if (mapper instanceof JsonMapper) {
                    mapperLookup.put(MediaType.JSON, mapper);
            } else {
                    mapperLookup.put(MediaType.XML, mapper);
            }
        });
    
      }
    
      /**
       * Creates a Jackson module using the default object mapper from {@link #create()}.
       */
      public JacksonModule() {
        this(new HashSet<ObjectMapper>(Arrays.asList(create())));
      }
    
      /**
       * Add a Jackson module to the object mapper. This method require a dependency injection
       * framework which is responsible for provisioning a module instance.
       *
       * @param module Module type.
       * @return This module.
       */
      public JacksonModule module(Class<? extends Module> module) {
     modules.add(module);
        return this;
      }
    
      @Override public void install(@Nonnull Jooby application) {
       ServiceRegistry services = application.getServices();
        
        if (mapperLookup.containsKey(MediaType.JSON)) {
            application.decoder(MediaType.json, this);
            application.encoder(MediaType.json, this);
            services.put(JsonMapper.class, (JsonMapper)mapperLookup.get(MediaType.JSON));
        }
    
        if (mapperLookup.containsKey(MediaType.XML)) {
            // to keep from having to bring in the dataformat.xml packages, use the parent 
            // of XmlMapper - since the JsonMapper type is used, this should never overwrite.
            application.decoder(MediaType.xml, this);
            application.encoder(MediaType.xml, this);
            services.put(ObjectMapper.class, mapperLookup.get(MediaType.XML));
        }
    
        application.onStarted(() -> {
          for (Class<? extends Module> type : modules) {
            Module module = application.require(type);
            mappers.forEach(mapper -> {
                    mapper.registerModule(module);
            });
           }
        });
      }
    
    @Override public byte[] encode(@Nonnull Context ctx, @Nonnull Object value) throws Exception {
        // Default to JSON in the case where the Accept header isn't specified since we are guaranteed 
        // to have a json mapper created by create()
        ObjectMapper mapper = mapperLookup.get(MediaType.JSON);
        ctx.setDefaultResponseType(MediaType.json);
    
        Value headerVal = ctx.header(Context.ACCEPT);
        if (headerVal != null && headerVal.value().contains(MediaType.XML)) {
            if (mapperLookup.containsKey(MediaType.XML)) {
                    ctx.setDefaultResponseType(MediaType.xml);
                    mapper = mapperLookup.get(MediaType.XML);
            } else {
                    // Some output to let the user know they need to set an XML Mapper, and that the request
                    // will be processed with the Json mapper instead?
            }
        }
    
        return mapper.writer().writeValueAsBytes(value);
      }
    
     @Override public Object decode(Context ctx, Type type) throws Exception {
        Body body = ctx.body();
        ObjectMapper mapper = mapperLookup.get(MediaType.JSON);
        Value headerVal = ctx.header(Context.ACCEPT);
    
        if (headerVal != null && headerVal.value().contains(MediaType.XML)) {
            if (mapperLookup.containsKey(MediaType.XML)) {
                    mapper = mapperLookup.get(MediaType.XML);
            } else {
                // Some output to let the user know they need to set an XML Mapper, and that the request
                // will be processed with the Json mapper instead?
            }
        }
    
        if (body.isInMemory()) {
          if (type == JsonNode.class) {
            return mapper.readTree(body.bytes());
          }
          return mapper.readValue(body.bytes(), mapper.getTypeFactory().constructType(type));
        } else {
          try (InputStream stream = body.stream()) {
            if (type == JsonNode.class) {
              return mapper.readTree(stream);
            }
    	return mapper.readValue(stream, mapper.getTypeFactory().constructType(type));
          }
        }
      }
      /**
       * Default object mapper. Install {@link Jdk8Module}, {@link JavaTimeModule},
       * {@link ParameterNamesModule} and {@link BlackbirdModule}.
       *
       * @return Object mapper instance.
       */
      public static @Nonnull ObjectMapper create() {
        ObjectMapper mapper = JsonMapper.builder()
            .addModule(new ParameterNamesModule())
            .addModule(new Jdk8Module())
            .addModule(new JavaTimeModule())
            .addModule(new BlackbirdModule())
            .build();
    
        return mapper;
      }
    }
    

    This allows me to use both an xml mapper and a json mapeper, based on what is passed in the ACCEPT header and specified in the produces = attribute of the annotations by doing

        val xmlMapper = XmlMapper(JacksonXmlModule())
          .registerModule(JavaTimeModule())
          .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
        install(JacksonModule(mutableSetOf<ObjectMapper>(xmlMapper)))
    

    and of course, using install(JacksonModule()) is still valid and still defaults to the json mapper. If I had passed in both an xmlMapper and a jsonMapper, then create() would not get called and the default jsonMapper wouldn't get made. Instead, the passed in jsonMapper would be used, just like what currently happens.

    Also. to make it clear that the Jackson module can handle more than just json, I suggest changing the package name from "json" to "data.formats" or "databind" or something more inclusive than just json since all of the modules can handle more than just json The same changes could probably be made for Gson and JaxB

    Please let me know your thoughts. There is a work around (using Jackson standalone without using jooby-jackson) but this would make the framework fulfill a common need out of the box.

    opened by cmitchell 0
  • How to inject an instance from the jooby's ServiceRegistry into my service using a Dagger 2?

    How to inject an instance from the jooby's ServiceRegistry into my service using a Dagger 2?

    I'm trying to use Dagger with jooby 2. I want to inject dslContext or anything else that is registered in the ServiceRegistry. How can I do this if the io.jooby.Jooby.require() method that is used to get the instance is only accessible from the instance of the Jooby class itself? For example I want to write:

    @Module
    class DaggerModule {
        @Provides
        fun dslContext(): DSLContext {
            return require(DSLContext::class)
        }
    }
    

    Injecting the application itself doesn't seem like a good idea.

    Are there any best practices on how to do this?

    opened by advortsov 2
  • Bump swagger-ui-dist from 3.51.1 to 3.52.0 in /modules/jooby-swagger-ui

    Bump swagger-ui-dist from 3.51.1 to 3.52.0 in /modules/jooby-swagger-ui

    Bumps swagger-ui-dist from 3.51.1 to 3.52.0.

    Release notes

    Sourced from swagger-ui-dist's releases.

    Swagger UI v3.52.0 Released!

    3.52.0 (2021-08-09)

    Features

    • js-yaml: update our main YAML parser to v4.1.0 (no esprima anymore in bundle) (3248428), closes #6804

    Swagger UI v3.51.2 Released!

    3.51.2 (2021-07-30)

    Bug Fixes

    • deps: bump swagger-client to v3.14.1 (#7440) (8daf4e4), closes #7436
    • minimum runtime Node.js version is now => 12.4
    Commits
    • b1ccd1f chore(release): cut the v3.52.0 release
    • ee40b00 chore(deps): bump swagger-client to v3.15.0
    • 3248428 feat(js-yaml): update our main YAML parser to v4.1.0
    • 770e748 ci: disable dependabot merge workflow
    • c266e6f chore(package): allow swagger-client version ranges (#7441)
    • 1c84fe0 Merge pull request #7419 from swagger-api/dependabot/npm_and_yarn/cypress-7.7.0
    • 414b1e2 chore(deps-dev): bump cypress from 7.5.0 to 7.7.0
    • 4c29a94 chore(release): cut the v3.51.2 release
    • 8daf4e4 fix(deps): bump swagger-client to v3.14.1 (#7440)
    • 9320e85 ci(dependabot): disable dependabot until V4 RC
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies javascript 
    opened by dependabot[bot] 0
  • Where I can get jooq and jdbc modules for jooby 2.10.0?

    Where I can get jooq and jdbc modules for jooby 2.10.0?

    I'm trying to use

    implementation("io.jooby:jooby-jooq:2.10.0")
    implementation("io.jooby:jooby-jdbc:2.10.0")
    

    with

    repositories {
        mavenCentral()
        mavenLocal()
        gradlePluginPortal()
        google()
    }
    

    but get "Could not find..." gradle message

    I see note that artifact was moved at https://mvnrepository.com/artifact/org.jooby/jooby but I follow the link and don’t find it there

    Where I can get jooq and jdbc modules for jooby 2.10.0?

    question 
    opened by advortsov 4
  • [MVC] TYPE_USE annotation on MVC method parameters break the annotation processor

    [MVC] TYPE_USE annotation on MVC method parameters break the annotation processor

    I finally figured out what is going on with

    #2407 and #2352 (although 2407 might still happen without annotations).

    If you use annotations of TYPE_USE like:

    https://checkerframework.org/api/org/checkerframework/checker/nullness/qual/NonNull.html

    and

    https://javadoc.io/static/org.eclipse.jdt/org.eclipse.jdt.annotation/2.0.0/org/eclipse/jdt/annotation/NonNull.html

    which is JSR 308 and not 305 (aka the findbug javax @Nonnull annotations that jooby uses) like so:

    @GET("/one")
    public ModelAndView one(@Nullable @QueryParam String name) {
    return null;
    }
    
    @GET("/two")
    public ModelAndView two(@Nullable @QueryParam String name) {
    return null;
    }
    

    The annotations compiler will generate lookup_[parameterName] methods even if they are String. As a result name will be a toString of ctx.query() and not ctx.query("name").

    The problem is how classes are being detected in the Jooby annotation processor.

    There are several places where you do TypeMirror.toString() or TypeElement.toString()

    If you do this on say the name variable argument above with the TYPE_USE annotation from Eclipse you will get:

    @org.eclipse.jdt.annotation.NonNull java.lang.String
    

    What you need to call is TypeElement.getQualifiedName().

    This is very similar to having the type parameters showing up for say Optional for those cases I believe erasure() is being called but I believe erasure doesn't fix type annotations. getQualifiedName prevents these problems.

    Anyway I'll try to get in a PR as this basically stops us from using our null pointer analysis.

    opened by agentgt 1
Releases(v2.10.0)
  • v2.10.0(Jul 18, 2021)

    Happy to announce a new release! 🚀 🎉

    • #2326 gradle: support new mainclass attribute
    • #2351 gradle: support gradle 6.8 or higher
    • #2240 Jooby.install(Supplier) doesn't share registry
    • #2357 Jooby header(String) doesn't support case insensitive
    • #2364 Netty: WebSocket compression
    • #2325 MVC annotations will never use custom Value Converters. @QueryParam and friends is confusing for custom objects
    • #2362 Kotlin: Improve coroutine context redefinition
    • #2368 JSONB module
    • #2369: Customize which error is considered connection lost
    • #2372: SSL (for jooby-http2-netty) broken for reactor Flux

    Changes

    Donate/Support

    Contributors

    @imeszaros

    Source code(tar.gz)
    Source code(zip)
  • v2.9.6(May 9, 2021)

    Happy to announce a new release! 🚀 🎉

    • #2194 SSL: allow to configure custom SSL provider (conscrypt)
    • #2210 Websockets onClose not working
    • #2260 Netty: Interrupted request leads to NPE using Netty + AccessLog
    • #2293 Undertow: error while sending non-blocking request with a large response
    • #2305: websocket.idleTimeout only working for whole minutes
    • #2257 Kotlin/Coroutine: Allow to redefine context

    Changes

    Donate/Support

    Contributors

    @imeszaros

    Source code(tar.gz)
    Source code(zip)
  • v2.9.5(Dec 27, 2020)

  • v2.9.4(Nov 26, 2020)

  • v2.9.3(Nov 12, 2020)

  • v2.9.2(Oct 24, 2020)

    Happy to announce a new release! 🚀 🎉

    • #2054 undertow: Fix exception thrown at startup
    • #1881 config: stackoverflow when OS has lot of environment variables
    • #2068: bean converter: favor empty constructor when there are multiple constructors
    • #2069: bean converter: support java.util.Collection while provisioning parameter
    • #2046: openapi: api doc generator doesn't respect mount() construction

    Changes

    Donate/Support

    Contributors

    @imeszaros

    Source code(tar.gz)
    Source code(zip)
  • v2.9.1(Sep 30, 2020)

    Happy to announce a new release! 🚀 🎉

    • #1995 Fix for double urldecoding with Formdata/Multipart
    • #1990 pac4j: URL resolver doesn't work with null context
    • #1999 OpenAPI generator now supports routes() and Kotlin objects
    • #1998 Chrome cookie SameSite issue
    • #1972 pac4j-module: Can't apply a client directly to a POST route?
    • #2026 hibernate/mvc: package scanner report bad byte code while processing generated byte code

    Changes

    Donate/Support

    Contributors

    @imeszaros

    Source code(tar.gz)
    Source code(zip)
  • v2.9.0(Sep 7, 2020)

    Happy to announce a new release! 🚀 🎉

    Thank you @imeszaros for all the work you did in this release.

    • #1968 Add Parameter Lookup
    • #1955 Metrics module
    • #1957 Transactional annotation for jdbc modules (hibernate, jdbi, ebean)
    • #1936 DSL for inline attachment
    • #1897 Jooby.start doesn't block anymore
    • #1909 undertow: fix event loop execution
    • #1973 pac4j: clients provisioning by dependency injection framework
    • #1924 Kotlin 1.4

    Changes

    Donate/Support

    Source code(tar.gz)
    Source code(zip)
  • v2.8.10(Aug 3, 2020)

    Happy to announce a new release! 🚀 🎉

    • #1843 : [mvc]: jooby-apt generates incorrect import statement for arrays
    • #1855: [openapi]: OpenApi execution of openapi resulted in exception: NullPointerException
    • #1866: [mvc]: jooby-apt and Lombok processing
    • #1860: Support for incremental annotation processing with Gradle
    • #1890: ctx.body().value() must throws a MissingValueException when empty/missing
    • #1859: Null/Empty body param mapped to empty string ("")
    • #1865: Null/Empty body param mapped to empty string ("")

    Changes

    Donate/Support

    Source code(tar.gz)
    Source code(zip)
  • v1.6.8(Jul 28, 2020)

  • v2.8.9(Jul 2, 2020)

  • v2.8.8(Jun 25, 2020)

    Happy and proud to announce a new release! 🚀 🎉

    • #1805: [openapi] generation fails if I use java.net.URI as a query param
    • #1806: [mvc]: java.util.List contains null if query param doesn't specified
    • #1807: [mvc]: VerifyError after upgrading to 2.8.5 when using @FormParam MVC Annotation
    • #1810: [ssl]: Mutual TLS
    • #1813: [ssl]: Bug in ServerOptions.java
    • #1814: [mvc]: jooby-apt generates incorrect import statement for bounded wildcards
    • #1815: File upload multipart hits an error of ClassCastException while using CsrfHandler

    Changes

    Donate/Support

    Source code(tar.gz)
    Source code(zip)
  • v2.8.7(Jun 20, 2020)

  • v2.8.6(Jun 18, 2020)

    Happy and proud to announce a new release! 🚀 🎉

    • #1771: Gzip: Set compression level
    • #1774: Access to Config/Environment from ctx.require()
    • #1785: Packaging documentation: https://jooby.io/packaging
    • #1786: mvc: follow/respect Nonnull annotation on HTTP parameter
    • #1794: openapi: ignore io.jooby.StatusCode
    • #1795: openapi: support RequestBody annotation
    • #1796: shutdown handler

    Changes

    Donate/Support

    Source code(tar.gz)
    Source code(zip)
  • v2.8.5(Jun 7, 2020)

    Happy and proud to announce the 2.8.5 release! 🚀 🎉

    • #1737: pac4j: signed session doesn't work
    • #1763: redis module https://jooby.io/modules/redis
    • #1765: redis http session https://jooby.io/modules/redis
    • #1745: http session time out
    • #1765: caffeine http session
    • #1769: openapi: support hidden annotation/attribute
    • #1767: mvc/apt: invalid class name. Affects IDE integration

    Changes

    Donate/Support

    Source code(tar.gz)
    Source code(zip)
  • v2.8.4(May 22, 2020)

  • v2.8.3(May 11, 2020)

  • v1.6.7(May 11, 2020)

  • v2.8.2(May 6, 2020)

    Happy and proud to announce the 2.8.2 release! 🚀 🎉

    • #1656 Netty: Fix Gzip with Assets
    • #1668 [jooby-cli] posix file permissions throws UnsupportedOperationException on Windows
    • #1681 MockRouter(unit test): support coroutine execution
    • #1676 Access to multipart form data file names
    • #1690 Thymeleaf Module
    • #1687 router: support hidden http method

    API/break changes

    • #1694 assets: requires classpath location/prefix
    • #1693 pac4j: turn off csrf authorizer

    Changes

    Donate/Support

    Source code(tar.gz)
    Source code(zip)
  • v2.8.1(Apr 16, 2020)

    Happy and proud to announce the 2.8.1 release! 🚀 🎉

    • #1637 Added Context.forward
    • #1634 Added Router.setTrustProxy(boolean)
    • #1650 UtowFileUpload.getFileSize throws exception when "Content-Length" header is missing.

    API/break changes

    • #1644 Context: remove getRequestUrl(useProxy)
    • #1645 Context: remove getHostAndPort(useProxy)
    • #1647 pac4j: remove trustProxy from Pac4jOptions
    • #1648 SSLhandler: remove trustProxy
    • #1646 Context: remove pathString()

    Changes

    Donate/Support

    Source code(tar.gz)
    Source code(zip)
  • v2.8.0(Apr 8, 2020)

  • v2.7.3(Mar 26, 2020)

    Happy and proud to announce the 2.7.3 release! 🚀 🎉

    • #1599 router: apply metadata from path/route operator #1599
    • #1600 router: rename route to routes
    • #1601 openapi: support @OpenAPIDefinition at application level
    • #1602 openapi: Support class-level @Tag annotation
    • #1607 openappi: Support @SecurityScheme(s), @ExternalDocs, @Extensions

    Changes

    Donate/Support

    Source code(tar.gz)
    Source code(zip)
  • v2.7.2(Mar 23, 2020)

    Happy and proud to announce the 2.7.2 release! 🚀 🎉

    • #1573 Optional path parameters
    • #1586 openapi: inheritance support
    • #1585 openapi: support regex on path parameter
    • #1590 Gson module https://jooby.io/modules/gson/
    • #1591 Some openapi @Operation annotation parameters are ignored
    • #1592 Nested data classes aren't added as component in openapi output

    Changes

    Support

    Support Jooby development using Patreon or contact me for alternative options.

    Source code(tar.gz)
    Source code(zip)
  • v2.7.1(Mar 21, 2020)

    Happy and proud to announce the 2.7.1 release! 🚀 🎉

    Bugs:

    • #1580 Openapi generation fails with NPE for mvc route with @Body and @PathParam
    • #1581 Openapi generation doesn't consider mvc routes provided over dagger DI
    • #1570 Unit Test using MockRouter with Session
    • #1582 Openapi generation put openapi.json file in a wrong place
    • #1583 jooby-cli: upgrade gradle generator to use the new plugin usage
    • #1584 jooby-cli: add --openapi option

    Changes

    Support

    Support Jooby development using Patreon or contact me for alternative options.

    Source code(tar.gz)
    Source code(zip)
  • v2.7.0(Mar 18, 2020)

    Happy and proud to announce the 2.7.0 release! 🚀 🎉

    New release comes with:

    • OpenAPI module
    • Gradle Ctrl+C bug. Sometimes doesn't jooby doesn't shutdown properly and kills gradle daemon. Solution was to listen for enter key and do a proper shutdown but also doesn't kill gradle daemon (can be reused it)

    Changes

    Support

    Support Jooby development using Patreon or contact me for alternative options.

    Source code(tar.gz)
    Source code(zip)
  • v2.6.2(Mar 16, 2020)

    Happy and proud to announce the 2.6.2 release! 🚀 🎉

    Bugs fixed:

    • #1545 responseCode is ignored from controllers returning kotlin.Unit
    • #1548 POST endpoint with Pac4j module kills Jooby server
    • #1552 Annotations inheritance in MVC routes

    Changes

    Support

    Support Jooby development using Patreon or contact me for alternative options.

    Source code(tar.gz)
    Source code(zip)
  • v2.6.1(Feb 5, 2020)

  • v2.6.0(Jan 20, 2020)

    Happy and proud to announce the 2.6.0 release! 🚀 🎉

    New release comes with:

    • Completion listener https://jooby.io/#router-handler-complete
    • Route reverse path https://javadoc.io/doc/io.jooby/jooby/latest/io/jooby/Route.html#reverse-java.util.Map-
    • AWS module https://jooby.io/modules/aws/
    • AccessLogHandler https://jooby.io/#handlers-accessloghandler
    • CsrfHandler https://jooby.io/#handlers-csrfhandler

    Changes

    Support

    Support Jooby development using Patreon or contact me for alternative options.

    Source code(tar.gz)
    Source code(zip)
  • v2.5.1(Jan 8, 2020)

  • v2.5.0(Dec 27, 2019)

Owner
jooby
The modular web framework for Java and Kotlin
jooby
Firefly is an asynchronous web framework for rapid development of high-performance web application.

What is Firefly? Firefly framework is an asynchronous Java web framework. It helps you create a web application Easy and Quickly. It provides asynchro

Alvin Qiu 279 Sep 15, 2021
:rocket: Lightning fast and elegant mvc framework for Java8

Based on Java8 + Netty4 to create a lightweight, high-performance, simple and elegant Web framework ?? Spend 1 hour to learn it to do something intere

Blade Framework 5.5k Sep 4, 2021
:rocket: Lightning fast and elegant mvc framework for Java8

Based on Java8 + Netty4 to create a lightweight, high-performance, simple and elegant Web framework ?? Spend 1 hour to learn it to do something intere

Blade Framework 5.5k Sep 7, 2021
True Object-Oriented Java Web Framework

Project architect: @paulodamaso Takes is a true object-oriented and immutable Java8 web development framework. Its key benefits, comparing to all othe

Yegor Bugayenko 689 Sep 10, 2021
Vaadin 6, 7, 8 is a Java framework for modern Java web applications.

Vaadin Framework Vaadin allows you to build modern web apps efficiently in plain Java, without touching low level web technologies. This repository co

Vaadin 1.7k Sep 11, 2021
Play Framework

Play Framework - The High Velocity Web Framework The Play Framework combines productivity and performance making it easy to build scalable web applica

Play Framework 12k Sep 8, 2021
Micro Java Web Framework

Micro Java Web Framework It's an open source (Apache License) micro web framework in Java, with minimal dependencies and a quick learning curve. The g

Pippo 758 Sep 14, 2021
GWT Open Source Project

GWT GWT is the official open source project for GWT releases 2.5 and onwards. In this document you have some quick instructions to build the SDK from

GWT 1.3k Sep 10, 2021
A simple expressive web framework for java. Spark has a kotlin DSL https://github.com/perwendel/spark-kotlin

Spark - a tiny web framework for Java 8 Spark 2.9.3 is out!! Changeset <dependency> <groupId>com.sparkjava</groupId> <artifactId>spark-core</a

Per Wendel 9.2k Sep 9, 2021
This is a Playwright Java Framework written in POM

Playwright Java Framework Main Objective of this Framework is to Build an Automation Framework that can be scalable, Easily Configurable and Ready to

AutoInfra 4 Aug 18, 2021
An Intuitive, Lightweight, High Performance Full Stack Java Web Framework.

mangoo I/O mangoo I/O is a Modern, Intuitive, Lightweight, High Performance Full Stack Java Web Framework. It is a classic MVC-Framework. The foundati

Sven Kubiak 52 Aug 30, 2021
Realtime Client Server Framework for the JVM, supporting WebSockets with Cross-Browser Fallbacks

Welcome to Atmosphere: The Event Driven Framework supporting WebSocket and HTTP The Atmosphere Framework contains client and server side components fo

Atmosphere Framework 3.5k Sep 8, 2021
CUBA Platform is a high level framework for enterprise applications development

Java RAD framework for enterprise web applications Website | Online Demo | Documentation | Guides | Forum CUBA Platform is a high level framework for

CUBA Platform 1.2k Sep 17, 2021
Ninja is a full stack web framework for Java. Rock solid, fast and super productive.

_______ .___ _______ ____. _____ \ \ | |\ \ | | / _ \ / | \| |/ | \ | |/ /_\ \ / | \

Ninja Web Framework 1.9k Aug 31, 2021
Apache Wicket - Component-based Java web framework

What is Apache Wicket? Apache Wicket is an open source, java, component based, web application framework. With proper mark-up/logic separation, a POJO

The Apache Software Foundation 582 Sep 14, 2021
DEPRECATED: use https://github.com/jhipster/jhipster-bom instead

JHipster BOM and server-side library - DEPRECATED Full documentation and information is available on our website at https://www.jhipster.tech/ This pr

JHipster 402 Sep 1, 2021
An evolving set of open source web components for building mobile and desktop web applications in modern browsers.

Vaadin components Vaadin components is an evolving set of high-quality user interface web components commonly needed in modern mobile and desktop busi

Vaadin 460 Sep 16, 2021
Tiny, easily embeddable HTTP server in Java.

NanoHTTPD – a tiny web server in Java NanoHTTPD is a light-weight HTTP server designed for embedding in other applications, released under a Modified

NanoHttpd 6k Sep 6, 2021
Spring Boot

Spring Boot Spring Boot helps you to create Spring-powered, production-grade applications and services with absolute minimum fuss. It takes an opinion

Spring 57.1k Sep 15, 2021