Actually the stack shows that there's already an instance of Cayenne runtime 
available to the code, but the runtime is in a bad state (not clear why). So 
thread binding should not be required.

Andrus


> On Mar 23, 2022, at 4:00 PM, John Huss <johnth...@gmail.com> wrote:
> 
> You have to bind the DI injector to the thread (and unbind it later):
> 
> CayenneRuntime.*bindThreadInjector*(cayenneRuntime.getInjector());
> 
> If you are using servlets, then CayenneFilter will do this for you.
> Otherwise you can bind it at the start of a request and unbind it at the
> end.
> 
> On Wed, Mar 23, 2022 at 9:10 AM Stefan Stegic <stefanste...@gmail.com>
> wrote:
> 
>> Hi Andrus,
>> 
>> Of course:
>> 
>> org.apache.cayenne.di.DIRuntimeException: DI container has no binding for
>> key <BindingKey: org.apache.cayenne.configuration.ObjectContextFactory>
>>        at
>> 
>> org.apache.cayenne.di.spi.DefaultInjector.getProvider(DefaultInjector.java:158)
>> ~[?:?]
>>        at
>> 
>> org.apache.cayenne.di.spi.DefaultInjector.getProvider(DefaultInjector.java:144)
>> ~[?:?]
>>        at
>> 
>> org.apache.cayenne.di.spi.DefaultInjector.getInstance(DefaultInjector.java:134)
>> ~[?:?]
>>        at
>> 
>> org.apache.cayenne.configuration.CayenneRuntime.newContext(CayenneRuntime.java:124)
>> ~[?:?]
>>        at
>> 
>> io.github.phuskus.firstspigotplugin.StatisticsController.reportPlayerConnectionEvent(StatisticsController.java:20)
>> ~[?:?]
>>        at
>> 
>> io.github.phuskus.firstspigotplugin.FirstSpigotPlugin.onEnable(FirstSpigotPlugin.java:29)
>> ~[?:?]
>>        at
>> org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264)
>> ~[spigot-api-1.18.1-R0.1-SNAPSHOT.jar:?]
>>        at
>> 
>> org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:342)
>> ~[spigot-api-1.18.1-R0.1-SNAPSHOT.jar:?]
>>        at
>> 
>> org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:480)
>> ~[spigot-api-1.18.1-R0.1-SNAPSHOT.jar:?]
>>        at
>> 
>> org.bukkit.craftbukkit.v1_18_R1.CraftServer.enablePlugin(CraftServer.java:521)
>> ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3443-Spigot-699290c-2c1e499]
>>        at
>> 
>> org.bukkit.craftbukkit.v1_18_R1.CraftServer.enablePlugins(CraftServer.java:435)
>> ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3443-Spigot-699290c-2c1e499]
>>        at
>> net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:612)
>> ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3443-Spigot-699290c-2c1e499]
>>        at
>> net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:414)
>> ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3443-Spigot-699290c-2c1e499]
>>        at
>> net.minecraft.server.dedicated.DedicatedServer.e(DedicatedServer.java:262)
>> ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3443-Spigot-699290c-2c1e499]
>>        at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:994)
>> ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3443-Spigot-699290c-2c1e499]
>>        at
>> net.minecraft.server.MinecraftServer.lambda$0(MinecraftServer.java:304)
>> ~[spigot-1.18.1-R0.1-SNAPSHOT.jar:3443-Spigot-699290c-2c1e499]
>>        at java.lang.Thread.run(Thread.java:833) [?:?]
>> 
>> On Wed, Mar 23, 2022 at 11:49 AM Andrus Adamchik <aadamc...@gmail.com>
>> wrote:
>> 
>>> Hi Stefan,
>>> 
>>> Could you include a full stack trace please?
>>> 
>>> Thanks,
>>> Andrus
>>> 
>>>> On Mar 23, 2022, at 1:04 AM, Stefan Stegic <stefanste...@gmail.com>
>>> wrote:
>>>> 
>>>> Hi,
>>>> 
>>>> 
>>>> First some context: I'm working on a custom Minecraft server (Spigot)
>>>> plugin. It's just a JAR that you export and place somewhere in the
>>> server's
>>>> folder structure.
>>>> 
>>>> I wrote a simple insert query via Cayenne's API. It works when I run
>> the
>>>> example JAR directly via executing Main from the command line (java -cp
>>>> myPlugin.jar path.to.Main), but it fails with the following error when
>>>> executed by the server in my plugin's OnEnable lifecycle hook:
>>>> 
>>>> org.apache.cayenne.di.DIRuntimeException: DI container has no binding
>> for
>>>> key <BindingKey: org.apache.cayenne.configuration.ObjectContextFactory>
>>>> 
>>>> 
>>>> My initial theory was that it's being executed from a different thread,
>>> so
>>>> the DI system might not have access to that dependency for some reason,
>>> but
>>>> it seems like the server executes this lifecycle hook from the main
>>> thread
>>>> as well (though they've named the thread "Server thread", and I don't
>>> know
>>>> how to check if it's the main thread for sure). Not sure if this is a
>>>> promising direction to pursue, but I got the hunch by looking at the
>>>> threadInjector bits of Cayenne's DI container docs.
>>>> 
>>>> My example looks like this:
>>>> 
>>>> ServerRuntime cayenneRuntime = ServerRuntime.builder()
>>>>               .addConfig("cayenne-project.xml")
>>>>               .build();ObjectContext ctx =
>> cayenneRuntime.newContext();
>>>> PlayerConnectionEvent newEvent =
>>>> ctx.newObject(PlayerConnectionEvent.class);
>>>> newEvent.setEventType(eType);
>>>> newEvent.setPlayerName(playerName);
>>>> newEvent.setIpAddress(ipAddress);
>>>> newEvent.setTimestampUnixSeconds(unixSeconds);
>>>> 
>>>> ctx.commitChanges();
>>>> 
>>>> Some help would be greatly appreciated, thanks in advance!
>>>> --
>>>> S poštovanjem,
>>>> *Stefan Stegić*
>>> 
>>> 
>> 
>> --
>> S poštovanjem,
>> *Stefan Stegić*
>> 

Reply via email to