Browse Source

jooby: dsl json (#5940)

- replace jackson with dsl-json
Edgar Espina 5 years ago
parent
commit
52cb1a3eb0

+ 13 - 6
frameworks/Java/jooby/pom.xml

@@ -13,6 +13,7 @@
   <properties>
   <properties>
     <jooby.version>2.8.10</jooby.version>
     <jooby.version>2.8.10</jooby.version>
     <netty.version>4.1.49.Final</netty.version>
     <netty.version>4.1.49.Final</netty.version>
+    <dsl-json.version>1.9.5</dsl-json.version>
     <postgresql.version>42.2.13</postgresql.version>
     <postgresql.version>42.2.13</postgresql.version>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <maven.compiler.source>1.8</maven.compiler.source>
     <maven.compiler.source>1.8</maven.compiler.source>
@@ -28,12 +29,6 @@
       <artifactId>jakarta.ws.rs-api</artifactId>
       <artifactId>jakarta.ws.rs-api</artifactId>
     </dependency>
     </dependency>
 
 
-    <!-- jackson -->
-    <dependency>
-      <groupId>io.jooby</groupId>
-      <artifactId>jooby-jackson</artifactId>
-    </dependency>
-
     <!-- jdbc -->
     <!-- jdbc -->
     <dependency>
     <dependency>
       <groupId>io.jooby</groupId>
       <groupId>io.jooby</groupId>
@@ -70,6 +65,13 @@
       <artifactId>vertx-pg-client</artifactId>
       <artifactId>vertx-pg-client</artifactId>
       <version>3.9.2</version>
       <version>3.9.2</version>
     </dependency>
     </dependency>
+
+    <!-- json -->
+    <dependency>
+      <groupId>com.dslplatform</groupId>
+      <artifactId>dsl-json-java8</artifactId>
+      <version>${dsl-json.version}</version>
+    </dependency>
   </dependencies>
   </dependencies>
 
 
   <build>
   <build>
@@ -105,6 +107,11 @@
               <artifactId>jooby-apt</artifactId>
               <artifactId>jooby-apt</artifactId>
               <version>${jooby.version}</version>
               <version>${jooby.version}</version>
             </path>
             </path>
+            <path>
+              <groupId>com.dslplatform</groupId>
+              <artifactId>dsl-json-java8</artifactId>
+              <version>${dsl-json.version}</version>
+            </path>
           </annotationProcessorPaths>
           </annotationProcessorPaths>
         </configuration>
         </configuration>
       </plugin>
       </plugin>

+ 6 - 13
frameworks/Java/jooby/src/main/java/com/techempower/App.java

@@ -1,11 +1,10 @@
 package com.techempower;
 package com.techempower;
 
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import io.jooby.Jooby;
 import io.jooby.Jooby;
 import io.jooby.hikari.HikariModule;
 import io.jooby.hikari.HikariModule;
-import io.jooby.json.JacksonModule;
 import io.jooby.rocker.RockerModule;
 import io.jooby.rocker.RockerModule;
 
 
+import javax.sql.DataSource;
 import java.nio.charset.StandardCharsets;
 import java.nio.charset.StandardCharsets;
 import java.sql.Connection;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.PreparedStatement;
@@ -15,8 +14,6 @@ import java.util.Collections;
 import java.util.List;
 import java.util.List;
 import java.util.StringJoiner;
 import java.util.StringJoiner;
 
 
-import javax.sql.DataSource;
-
 import static com.techempower.Util.randomWorld;
 import static com.techempower.Util.randomWorld;
 import static io.jooby.ExecutionMode.EVENT_LOOP;
 import static io.jooby.ExecutionMode.EVENT_LOOP;
 import static io.jooby.MediaType.JSON;
 import static io.jooby.MediaType.JSON;
@@ -30,10 +27,6 @@ public class App extends Jooby {
   private static final byte[] MESSAGE_BYTES = MESSAGE.getBytes(StandardCharsets.UTF_8);
   private static final byte[] MESSAGE_BYTES = MESSAGE.getBytes(StandardCharsets.UTF_8);
 
 
   {
   {
-    /** JSON: */
-    install(new JacksonModule());
-    ObjectMapper mapper = require(ObjectMapper.class);
-
     /** Database: */
     /** Database: */
     install(new HikariModule());
     install(new HikariModule());
     DataSource ds = require(DataSource.class);
     DataSource ds = require(DataSource.class);
@@ -47,7 +40,7 @@ public class App extends Jooby {
 
 
     get("/json", ctx -> ctx
     get("/json", ctx -> ctx
         .setResponseType(JSON)
         .setResponseType(JSON)
-        .send(mapper.writeValueAsBytes(new Message(MESSAGE)))
+        .send(Json.encode(new Message(MESSAGE)))
     );
     );
 
 
     /** Go blocking: */
     /** Go blocking: */
@@ -67,7 +60,7 @@ public class App extends Jooby {
         }
         }
         return ctx
         return ctx
             .setResponseType(JSON)
             .setResponseType(JSON)
-            .send(mapper.writeValueAsBytes(result));
+            .send(Json.encode(result));
       });
       });
 
 
       /** Multiple queries: */
       /** Multiple queries: */
@@ -86,7 +79,7 @@ public class App extends Jooby {
         }
         }
         return ctx
         return ctx
             .setResponseType(JSON)
             .setResponseType(JSON)
-            .send(mapper.writeValueAsBytes(result));
+            .send(Json.encode(result));
       });
       });
 
 
       /** Updates: */
       /** Updates: */
@@ -119,8 +112,8 @@ public class App extends Jooby {
             statement.executeUpdate();
             statement.executeUpdate();
           }
           }
         }
         }
-        ctx.setResponseType(JSON);
-        return ctx.send(mapper.writeValueAsBytes(result));
+        return ctx.setResponseType(JSON)
+            .send(Json.encode(result));
       });
       });
 
 
       /** Fortunes: */
       /** Fortunes: */

+ 1 - 6
frameworks/Java/jooby/src/main/java/com/techempower/JaxrsApp.java

@@ -1,8 +1,6 @@
 package com.techempower;
 package com.techempower;
 
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import io.jooby.hikari.HikariModule;
 import io.jooby.hikari.HikariModule;
-import io.jooby.json.JacksonModule;
 import io.jooby.rocker.RockerModule;
 import io.jooby.rocker.RockerModule;
 
 
 import javax.sql.DataSource;
 import javax.sql.DataSource;
@@ -13,16 +11,13 @@ import static io.jooby.Jooby.runApp;
 public class JaxrsApp {
 public class JaxrsApp {
   public static void main(String[] args) {
   public static void main(String[] args) {
     runApp(args, EVENT_LOOP, app -> {
     runApp(args, EVENT_LOOP, app -> {
-      /** JSON: */
-      app.install(new JacksonModule());
-
       /** Database: */
       /** Database: */
       app.install(new HikariModule());
       app.install(new HikariModule());
 
 
       /** Template engine: */
       /** Template engine: */
       app.install(new RockerModule());
       app.install(new RockerModule());
 
 
-      app.mvc(new Resource(app.require(DataSource.class), app.require(ObjectMapper.class)));
+      app.mvc(new Resource(app.require(DataSource.class)));
     });
     });
   }
   }
 }
 }

+ 26 - 0
frameworks/Java/jooby/src/main/java/com/techempower/Json.java

@@ -0,0 +1,26 @@
+package com.techempower;
+
+import com.dslplatform.json.DslJson;
+import com.dslplatform.json.JsonWriter;
+import com.dslplatform.json.runtime.Settings;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public class Json {
+  private final static DslJson<Object> dslJson = new DslJson<>(Settings.basicSetup());
+
+  private final static ThreadLocal<JsonWriter> pool = new ThreadLocal<JsonWriter>() {
+    @Override protected JsonWriter initialValue() {
+      return dslJson.newWriter(1024);
+    }
+  };
+
+  public static final ByteBuffer encode(Object data) throws IOException {
+    JsonWriter writer = pool.get();
+    writer.reset();
+    dslJson.serialize(writer, data);
+    return ByteBuffer.wrap(writer.getByteBuffer(), 0, writer.size());
+  }
+
+}

+ 3 - 0
frameworks/Java/jooby/src/main/java/com/techempower/Message.java

@@ -1,5 +1,8 @@
 package com.techempower;
 package com.techempower;
 
 
+import com.dslplatform.json.CompiledJson;
+
+@CompiledJson
 public class Message {
 public class Message {
   private String message;
   private String message;
 
 

+ 3 - 10
frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java

@@ -1,9 +1,7 @@
 package com.techempower;
 package com.techempower;
 
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import io.jooby.Jooby;
 import io.jooby.Jooby;
 import io.jooby.ServerOptions;
 import io.jooby.ServerOptions;
-import io.jooby.json.JacksonModule;
 import io.jooby.rocker.RockerModule;
 import io.jooby.rocker.RockerModule;
 import io.vertx.pgclient.PgPool;
 import io.vertx.pgclient.PgPool;
 import io.vertx.sqlclient.Row;
 import io.vertx.sqlclient.Row;
@@ -41,10 +39,6 @@ public class ReactivePg extends Jooby {
     /** Template engine: */
     /** Template engine: */
     install(new RockerModule());
     install(new RockerModule());
 
 
-    /** JSON: */
-    install(new JacksonModule());
-    ObjectMapper mapper = require(ObjectMapper.class);
-
     /** Single query: */
     /** Single query: */
     get("/db", ctx -> {
     get("/db", ctx -> {
       clients.next().preparedQuery(SELECT_WORLD).execute(Tuple.of(randomWorld()), rsp -> {
       clients.next().preparedQuery(SELECT_WORLD).execute(Tuple.of(randomWorld()), rsp -> {
@@ -53,8 +47,7 @@ public class ReactivePg extends Jooby {
             RowIterator<Row> rs = rsp.result().iterator();
             RowIterator<Row> rs = rsp.result().iterator();
             Row row = rs.next();
             Row row = rs.next();
             ctx.setResponseType(JSON)
             ctx.setResponseType(JSON)
-                .send(
-                    mapper.writeValueAsBytes(new World(row.getInteger(0), row.getInteger(1))));
+                .send(Json.encode(new World(row.getInteger(0), row.getInteger(1))));
           } else {
           } else {
             ctx.sendError(rsp.cause());
             ctx.sendError(rsp.cause());
           }
           }
@@ -87,7 +80,7 @@ public class ReactivePg extends Jooby {
           if (counter.incrementAndGet() == queries && !failed.get()) {
           if (counter.incrementAndGet() == queries && !failed.get()) {
             try {
             try {
               ctx.setResponseType(JSON)
               ctx.setResponseType(JSON)
-                  .send(mapper.writeValueAsBytes(result));
+                  .send(Json.encode(result));
             } catch (IOException x) {
             } catch (IOException x) {
               ctx.sendError(x);
               ctx.sendError(x);
             }
             }
@@ -131,7 +124,7 @@ public class ReactivePg extends Jooby {
                   } else {
                   } else {
                     try {
                     try {
                       ctx.setResponseType(JSON)
                       ctx.setResponseType(JSON)
-                          .send(mapper.writeValueAsBytes(result));
+                          .send(Json.encode(result));
                     } catch (IOException x) {
                     } catch (IOException x) {
                       ctx.sendError(x);
                       ctx.sendError(x);
                     }
                     }

+ 5 - 9
frameworks/Java/jooby/src/main/java/com/techempower/Resource.java

@@ -1,6 +1,5 @@
 package com.techempower;
 package com.techempower;
 
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import io.jooby.Context;
 import io.jooby.Context;
 import io.jooby.annotations.Dispatch;
 import io.jooby.annotations.Dispatch;
 import views.fortunes;
 import views.fortunes;
@@ -30,11 +29,8 @@ public class Resource {
 
 
   private final DataSource dataSource;
   private final DataSource dataSource;
 
 
-  private final ObjectMapper mapper;
-
-  public Resource(DataSource dataSource, ObjectMapper mapper) {
+  public Resource(DataSource dataSource) {
     this.dataSource = dataSource;
     this.dataSource = dataSource;
-    this.mapper = mapper;
   }
   }
 
 
   @GET @Path("/plaintext")
   @GET @Path("/plaintext")
@@ -45,7 +41,7 @@ public class Resource {
   @GET @Path("/json")
   @GET @Path("/json")
   public void json(Context ctx) throws IOException {
   public void json(Context ctx) throws IOException {
     ctx.setResponseType(JSON);
     ctx.setResponseType(JSON);
-    ctx.send(mapper.writeValueAsBytes(new Message(MESSAGE)));
+    ctx.send(Json.encode(new Message(MESSAGE)));
   }
   }
 
 
   @GET @Path("/db")
   @GET @Path("/db")
@@ -62,7 +58,7 @@ public class Resource {
       }
       }
     }
     }
     ctx.setResponseType(JSON);
     ctx.setResponseType(JSON);
-    ctx.send(mapper.writeValueAsBytes(result));
+    ctx.send(Json.encode(result));
   }
   }
 
 
   @GET @Path("/queries")
   @GET @Path("/queries")
@@ -81,7 +77,7 @@ public class Resource {
       }
       }
     }
     }
     ctx.setResponseType(JSON);
     ctx.setResponseType(JSON);
-    ctx.send(mapper.writeValueAsBytes(result));
+    ctx.send(Json.encode(result));
   }
   }
 
 
   @GET @Path("/updates")
   @GET @Path("/updates")
@@ -116,7 +112,7 @@ public class Resource {
       }
       }
     }
     }
     ctx.setResponseType(JSON);
     ctx.setResponseType(JSON);
-    ctx.send(mapper.writeValueAsBytes(result));
+    ctx.send(Json.encode(result));
   }
   }
 
 
   @GET @Path("/fortunes")
   @GET @Path("/fortunes")

+ 4 - 0
frameworks/Java/jooby/src/main/java/com/techempower/World.java

@@ -1,8 +1,12 @@
 package com.techempower;
 package com.techempower;
 
 
+import com.dslplatform.json.CompiledJson;
+
+@CompiledJson
 public class World {
 public class World {
 
 
   private int id;
   private int id;
+
   private int randomNumber;
   private int randomNumber;
 
 
   public World(int id, int randomNumber) {
   public World(int id, int randomNumber) {