From c9c81fdc85470df43b086abb257d611a6fd0574a Mon Sep 17 00:00:00 2001 From: kliushnichenko Date: Fri, 17 May 2024 17:57:52 +0300 Subject: [PATCH 1/5] reproduce ClassCastException issue --- modules/jooby-avaje-inject/pom.xml | 54 +++++++++++++++++++ .../avaje/inject/AvajeInjectModuleTest.java | 25 +++++++++ .../io/jooby/avaje/inject/app/Controller.java | 28 ++++++++++ .../io/jooby/avaje/inject/app/TestApp.java | 15 ++++++ 4 files changed, 122 insertions(+) create mode 100644 modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/AvajeInjectModuleTest.java create mode 100644 modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/Controller.java create mode 100644 modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/TestApp.java diff --git a/modules/jooby-avaje-inject/pom.xml b/modules/jooby-avaje-inject/pom.xml index ff8e2db0ae..b0bc6c0b51 100644 --- a/modules/jooby-avaje-inject/pom.xml +++ b/modules/jooby-avaje-inject/pom.xml @@ -44,6 +44,30 @@ test + + io.jooby + jooby-netty + test + + + + io.jooby + jooby-test + test + + + + io.jooby + jooby-jackson + test + + + + com.squareup.okhttp3 + okhttp + test + + org.jacoco org.jacoco.agent @@ -51,4 +75,34 @@ test + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + test + test-compile + + + + + -parameters + + + + io.jooby + jooby-apt + + + io.avaje + avaje-inject-generator + + + + + + diff --git a/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/AvajeInjectModuleTest.java b/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/AvajeInjectModuleTest.java new file mode 100644 index 0000000000..0777fb0c35 --- /dev/null +++ b/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/AvajeInjectModuleTest.java @@ -0,0 +1,25 @@ +package io.jooby.avaje.inject; + +import io.jooby.avaje.inject.app.TestApp; +import io.jooby.test.JoobyTest; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class AvajeInjectModuleTest { + + static OkHttpClient client = new OkHttpClient(); + + @JoobyTest(TestApp.class) + public void shouldPropagateJoobyServicesToAvajeBeanScope(String serverPath) throws IOException { + Request request = new Request.Builder().url(serverPath + "/ping").build(); + + try (Response response = client.newCall(request).execute()) { + assertEquals("pong", response.body().string()); + } + } +} diff --git a/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/Controller.java b/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/Controller.java new file mode 100644 index 0000000000..4962894dba --- /dev/null +++ b/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/Controller.java @@ -0,0 +1,28 @@ +package io.jooby.avaje.inject.app; + +import com.fasterxml.jackson.databind.json.JsonMapper; +import io.avaje.inject.InjectModule; +import io.jooby.annotation.GET; +import io.jooby.annotation.Path; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; + +@Singleton +@Path("") +@InjectModule(requires = {JsonMapper.class}) +public class Controller { + + private final JsonMapper jsonMapper; + + @Inject + public Controller(JsonMapper jsonMapper) { + this.jsonMapper = jsonMapper; + } + + @GET + @Path("/ping") + public String ping() { + jsonMapper.version(); + return "pong"; + } +} diff --git a/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/TestApp.java b/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/TestApp.java new file mode 100644 index 0000000000..4b6676114e --- /dev/null +++ b/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/TestApp.java @@ -0,0 +1,15 @@ +package io.jooby.avaje.inject.app; + +import io.jooby.Jooby; +import io.jooby.avaje.inject.AvajeInjectModule; +import io.jooby.jackson.JacksonModule; + +public class TestApp extends Jooby { + + { + install(new JacksonModule()); + install(AvajeInjectModule.of()); + + mvc(Controller.class); + } +} From 9b91406dc33fc7fb4583c495f5cb9b9f55912758 Mon Sep 17 00:00:00 2001 From: kliushnichenko Date: Fri, 17 May 2024 18:24:44 +0300 Subject: [PATCH 2/5] fix ClassCastException issue --- .../main/java/io/jooby/avaje/inject/AvajeInjectModule.java | 2 +- .../java/io/jooby/avaje/inject/AvajeInjectModuleTest.java | 2 +- .../src/test/java/io/jooby/avaje/inject/app/TestApp.java | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java index 7ac6f62a3f..56ecafd690 100644 --- a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java +++ b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java @@ -68,7 +68,7 @@ public void install(Jooby application) throws Exception { e -> { final var key = e.getKey(); if (key.getName() == null) { - beanScope.provideDefault(key.getType(), e::getValue); + beanScope.provideDefault(key.getType(), () -> e.getValue().get()); } else { beanScope.bean(key.getName(), key.getType(), e.getValue()); } diff --git a/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/AvajeInjectModuleTest.java b/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/AvajeInjectModuleTest.java index 0777fb0c35..ad59916bb0 100644 --- a/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/AvajeInjectModuleTest.java +++ b/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/AvajeInjectModuleTest.java @@ -16,7 +16,7 @@ public class AvajeInjectModuleTest { @JoobyTest(TestApp.class) public void shouldPropagateJoobyServicesToAvajeBeanScope(String serverPath) throws IOException { - Request request = new Request.Builder().url(serverPath + "/ping").build(); + Request request = new Request.Builder().url(serverPath + "ping").build(); try (Response response = client.newCall(request).execute()) { assertEquals("pong", response.body().string()); diff --git a/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/TestApp.java b/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/TestApp.java index 4b6676114e..c7251c08d4 100644 --- a/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/TestApp.java +++ b/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/TestApp.java @@ -1,5 +1,6 @@ package io.jooby.avaje.inject.app; +import com.fasterxml.jackson.databind.json.JsonMapper; import io.jooby.Jooby; import io.jooby.avaje.inject.AvajeInjectModule; import io.jooby.jackson.JacksonModule; @@ -11,5 +12,10 @@ public class TestApp extends Jooby { install(AvajeInjectModule.of()); mvc(Controller.class); + + onStarted(() -> { + JsonMapper jsonMapper = require(JsonMapper.class); + jsonMapper.version(); + }); } } From a50315055529f55e1852eafaa29beeab79a38888 Mon Sep 17 00:00:00 2001 From: kliushnichenko Date: Fri, 17 May 2024 18:31:42 +0300 Subject: [PATCH 3/5] remove Config (it is already in registry) --- .../java/io/jooby/avaje/inject/AvajeInjectModule.java | 1 - .../test/java/io/jooby/avaje/inject/app/Controller.java | 9 +++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java index 56ecafd690..03910a7f5c 100644 --- a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java +++ b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java @@ -80,7 +80,6 @@ public void install(Jooby application) throws Exception { // configuration properties final var config = environment.getConfig(); beanScope.propertyPlugin(new JoobyPropertyPlugin(config)); - beanScope.bean(Config.class, config); for (var entry : config.entrySet()) { String name = entry.getKey(); diff --git a/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/Controller.java b/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/Controller.java index 4962894dba..b54d18b1bf 100644 --- a/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/Controller.java +++ b/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/Controller.java @@ -1,6 +1,7 @@ package io.jooby.avaje.inject.app; import com.fasterxml.jackson.databind.json.JsonMapper; +import com.typesafe.config.Config; import io.avaje.inject.InjectModule; import io.jooby.annotation.GET; import io.jooby.annotation.Path; @@ -9,20 +10,24 @@ @Singleton @Path("") -@InjectModule(requires = {JsonMapper.class}) +@InjectModule(requires = {JsonMapper.class, Config.class}) public class Controller { private final JsonMapper jsonMapper; + private final Config config; @Inject - public Controller(JsonMapper jsonMapper) { + public Controller(JsonMapper jsonMapper, Config config) { this.jsonMapper = jsonMapper; + this.config = config; } @GET @Path("/ping") public String ping() { jsonMapper.version(); + config.isEmpty(); + return "pong"; } } From d99b26c4bb5e16df580f818c0b163ec2705279e7 Mon Sep 17 00:00:00 2001 From: kliushnichenko Date: Fri, 17 May 2024 19:53:09 +0300 Subject: [PATCH 4/5] test for @Named --- .../io/jooby/avaje/inject/AvajeInjectModuleTest.java | 2 +- .../test/java/io/jooby/avaje/inject/app/Controller.java | 9 ++++++--- .../src/test/java/io/jooby/avaje/inject/app/TestApp.java | 3 +++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/AvajeInjectModuleTest.java b/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/AvajeInjectModuleTest.java index ad59916bb0..aeb91e150e 100644 --- a/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/AvajeInjectModuleTest.java +++ b/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/AvajeInjectModuleTest.java @@ -19,7 +19,7 @@ public void shouldPropagateJoobyServicesToAvajeBeanScope(String serverPath) thro Request request = new Request.Builder().url(serverPath + "ping").build(); try (Response response = client.newCall(request).execute()) { - assertEquals("pong", response.body().string()); + assertEquals("test", response.body().string()); } } } diff --git a/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/Controller.java b/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/Controller.java index b54d18b1bf..f455f6b2a3 100644 --- a/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/Controller.java +++ b/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/Controller.java @@ -6,20 +6,23 @@ import io.jooby.annotation.GET; import io.jooby.annotation.Path; import jakarta.inject.Inject; +import jakarta.inject.Named; import jakarta.inject.Singleton; @Singleton @Path("") -@InjectModule(requires = {JsonMapper.class, Config.class}) +@InjectModule(requires = {JsonMapper.class, Config.class, String.class}) public class Controller { private final JsonMapper jsonMapper; private final Config config; + private final String env; @Inject - public Controller(JsonMapper jsonMapper, Config config) { + public Controller(JsonMapper jsonMapper, Config config, @Named("application.env") String env) { this.jsonMapper = jsonMapper; this.config = config; + this.env = env; } @GET @@ -28,6 +31,6 @@ public String ping() { jsonMapper.version(); config.isEmpty(); - return "pong"; + return this.env; } } diff --git a/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/TestApp.java b/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/TestApp.java index c7251c08d4..f091511c98 100644 --- a/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/TestApp.java +++ b/modules/jooby-avaje-inject/src/test/java/io/jooby/avaje/inject/app/TestApp.java @@ -1,6 +1,7 @@ package io.jooby.avaje.inject.app; import com.fasterxml.jackson.databind.json.JsonMapper; +import com.typesafe.config.Config; import io.jooby.Jooby; import io.jooby.avaje.inject.AvajeInjectModule; import io.jooby.jackson.JacksonModule; @@ -15,7 +16,9 @@ public class TestApp extends Jooby { onStarted(() -> { JsonMapper jsonMapper = require(JsonMapper.class); + Config config = require(Config.class); jsonMapper.version(); + config.isEmpty(); }); } } From ebc79c3c8bd55f9d93ae9d2494f9cdc44ef66717 Mon Sep 17 00:00:00 2001 From: kliushnichenko Date: Fri, 17 May 2024 20:23:54 +0300 Subject: [PATCH 5/5] polish --- modules/jooby-avaje-inject/pom.xml | 6 ------ .../main/java/io/jooby/avaje/inject/AvajeInjectModule.java | 4 +--- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/modules/jooby-avaje-inject/pom.xml b/modules/jooby-avaje-inject/pom.xml index b0bc6c0b51..0a80f46ea2 100644 --- a/modules/jooby-avaje-inject/pom.xml +++ b/modules/jooby-avaje-inject/pom.xml @@ -38,12 +38,6 @@ test - - org.mockito - mockito-core - test - - io.jooby jooby-netty diff --git a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java index 03910a7f5c..d495c959fa 100644 --- a/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java +++ b/modules/jooby-avaje-inject/src/main/java/io/jooby/avaje/inject/AvajeInjectModule.java @@ -8,8 +8,6 @@ import java.util.List; import java.util.stream.Collectors; -import com.typesafe.config.Config; - import io.avaje.inject.BeanScope; import io.avaje.inject.BeanScopeBuilder; import io.jooby.Extension; @@ -68,7 +66,7 @@ public void install(Jooby application) throws Exception { e -> { final var key = e.getKey(); if (key.getName() == null) { - beanScope.provideDefault(key.getType(), () -> e.getValue().get()); + beanScope.provideDefault(key.getType(), e.getValue()::get); } else { beanScope.bean(key.getName(), key.getType(), e.getValue()); }