[JAVA] Si vous en avez assez de "Spring Boot", pourquoi ne pas essayer "jooby"?

Dans les projets auxquels j'ai participé récemment, j'ai le sentiment que l'adoption de "Spring Boot" (ou "Spring Web") est devenue la norme de facto. Je suis très reconnaissant pour les nombreuses fonctionnalités fournies par "Spring Boot", mais je suis également insatisfait.

Par exemple:

Il m'est arrivé de rencontrer jooby et de l'essayer, et cela m'a impressionné, alors j'aimerais vous le présenter.


Qu'est-ce que Jooby

C'est un cadre qui se concentre sur l'attribution de chemins aux «fonctions qui se convertissent en réponses».

Le site officiel dit: "C'est un micro-framework évolutif, rapide, orienté module, fait avec Java." Quand on m'a parlé d'un micro-framework, j'ai pensé que c'était "à la mode et enfumé". Quand j'ai essayé de l'utiliser, j'ai pensé que c'était un framework qui «commençait à être compact et facile à développer».

De plus, lorsque j'ai lancé l'application, elle a démarré rapidement et j'ai ressenti le "style microframework". (Le serveur basé sur netty démarre)

Source d'exemple de site officiel

Échantillon Java

import org.jooby.Jooby;
public class App extends Jooby {
  { get("/", () -> "Hey Jooby!"); }
  public static void main(final String[] args) {
    run(App::new, args);
  }
}

Cela seul démarrera le serveur d'application Web. C'est aussi bien que ** kotlin soit également pris en charge ** en standard.

Échantillon Kotlin

import org.jooby.*
class App : Kooby ({
    get("/") { "Hey Jooby!" }
})
fun main(args:Array<String>) {  run(::App, *args) }

Dans ce blog, je vais le présenter dans la source de kotlin ci-dessous.


Implémentation du routage

Le get (" / ") {" Hey Jooby! "} Dans l '"exemple Kotlin" ci-dessus se trouve l'implémentation du routage. Cela signifie que lorsque vous accédez au chemin racine, la chaîne «Hey Jooby!» Est renvoyée. (Intuitif et très facile à comprendre)

    get("/hoge") { "hogeres" }
    post("/foo/boo") { FooControler.boo() }

Si vous implémentez une telle chose, cela signifie que l'application Web est terminée.

Voici un exemple un peu plus compliqué. (Lorsque "Traitement des demandes et réponses" et "Utilisation du moteur de modèle")

get("/boo/hoge") { req , rsp -> BooControler.hoge(req.param("name") , rsp)
    Results.html("freemarker/boo/hoge.html")
}

Je pense que c'est bien de pouvoir implémenter intuitivement des choses faciles et difficiles.


Implémentations autres que le routage

Je présenterai les implémentations susceptibles d'être utilisées en dehors du routage.

Gestion des exceptions

Vous pouvez implémenter ce à quoi répondre lorsqu'une exception se produit.

err { req, rsp, err ->
    val cause = err.cause
    when (cause) {
      is MyException1 -> { /*Mise en œuvre de la réponse*/ }
      is MyException2 -> { /*Mise en œuvre de la réponse*/ }
      else -> Err.DefHandler().handle(req, rsp, err)
    }
}

Si vous souhaitez gérer uniquement des exceptions spécifiques, vous pouvez également effectuer les opérations suivantes.

err(MyException1::class.java) { req, rsp, err -> /*réduction*/}

Filter ###

Vous pouvez insérer un filtrage avant et après le traitement de la demande. Cela vous permet de générer des journaux d'accès et d'ajouter des en-têtes HTTP et des cookies de manière uniforme ou conditionnelle.

before("**") { req, rsp -> initLoginfo(req, rsp) }

after("**") { req, rsp, result ->
    accessLog(req, rsp, result)
            .header("Access-Control-Allow-Origin", appEnv.allowOrigin)
            .header("Access-Control-Allow-Credentials", true)
}

MODULES

jooby est une idée qui étend la fonction en spécifiant le "module" à utiliser. Le support standard est décrit dans [MODULES] mod sur le site officiel.

Définissez la dépendance de Maven et gradle, et avant le routage, L'utilisation de base est d'implémenter et d'ajouter des fonctions telles que ʻuse () `.

Voici quelques exemples.

Utilisé pour le moteur de modèle Freemarker

Vous pouvez utiliser le modèle Freemarker en codant comme suit.

    use(Ftl("/freemarker"))

Dans l'exemple ci-dessus Cela signifie que vous irez voir le modèle depuis le répertoire où classpath passe au répertoire freemarker.

Lorsque vous utilisez réellement le modèle, vous écrirez le code comme suit.

get("/hoge/") {
    Results.html("hoge/index.html")
            .put("hogeParam", hogeBoo.hoge)
}

Dans l'exemple ci-dessus, dans le fichier modèle freemarker / hoge / index.html, vous pouvez accéder à l'objet comme la variable $ {hogeParam}. (Vous pouvez utiliser Freemarker en standard)

Utilisez jackson pour l'API RESTish

Si vous codez comme suit

    use(Jackson())

Écrivez simplement du code comme `get (" / myjson ") {MyJsonObject (firstName =" Yamada ", name =" tarou ", age =" 25 ")} ʻet la réponse sera renvoyée sous la forme json, RESTish. Cela facilite la création d'API.

Cependant, si vous souhaitez simplement renvoyer une chaîne, la valeur de retour se comportera comme si elle était placée entre guillemets. (Par exemple, get (" / alive / chek ") {" I'm alive "} aura pour résultat que la chaîne de réponse sera"Je suis vivant")

Si vous voulez renvoyer une réponse autre que json, je pense qu'il vaut mieux laisser Jackson former json par vous-même au lieu d'utiliser ʻuse (Jackson ()) `.


Autre micro-framework web

[Spark Framework] sp est un autre "micro-framework web" populaire. L'idée de mapper un chemin vers une réponse est similaire à jooby.

En termes de simplicité, c'est encore plus facile que jooby. Cependant, jooby semble être plus facile pour une manipulation fine. Aussi, en termes d'extensibilité avec [MODULES] et mod, je pense que jooby sera mieux loti.

Veuillez comparer lequel est le meilleur en fonction de la situation que vous utilisez.


jooby Comment était-ce?

Bonne chance


Page associée

Recommended Posts

Si vous en avez assez de "Spring Boot", pourquoi ne pas essayer "jooby"?
Si vous en avez assez de dessiner des diagrammes ER
Lorsque @Transactional of Spring Boot ne fonctionne pas
[Spring Boot] Si vous utilisez Spring Boot, il était pratique d'utiliser de nombreux utilitaires.
Si vous souhaitez séparer le traitement Spring Boot + Thymeleaf
Essayez Spring Boot de 0 à 100.
Démarrez avec Spring Boot
Essayez d'utiliser Spring Boot Security
Essayez Spring Boot sur Mac
Obtenez une instance proxy du composant lui-même dans Spring Boot
Actionneur Spring Boot 2.0, 3 changements à connaître pour le faire fonctionner
Mémorandum lorsque Spring Boot 1.5.10 → Spring Boot 2.0.0
Sortie de message (Spring boot)
Obtenez des résultats de validation avec Spring Boot
Essayez d'exécuter Spring Boot sur Kubernetes
Spring Boot + MyBatis J'obtiens cette erreur si je ne configure pas la base de données