微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Jersey 3 - 使用 bindFactory 配置绑定

如何解决Jersey 3 - 使用 bindFactory 配置绑定

使用 Jersey 3.0.1,我正在努力使绑定工作。

我有以下工厂的绑定模块:

    /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Tooling.targets(5,5): Error XARSD7023: System.IO.DirectoryNotFoundException: Could not find a part of the path '/Users/giulioserra/Library/Android/sdk'.
  at System.IO.Enumeration.FileSystemEnumerator`1[TResult].CreateDirectoryHandle (System.String path,System.Boolean ignoreNotFound) [0x00032] in <36514b14425c4337b446653c547aa9c3>:0 
  at System.IO.Enumeration.FileSystemEnumerator`1[TResult]..ctor (System.String directory,System.IO.Enumerationoptions options) [0x00048] in <36514b14425c4337b446653c547aa9c3>:0 
  at System.IO.Enumeration.FileSystemEnumerable`1+DelegateEnumerator[TResult]..ctor (System.IO.Enumeration.FileSystemEnumerable`1[TResult] enumerable) [0x00000] in <36514b14425c4337b446653c547aa9c3>:0 
  at System.IO.Enumeration.FileSystemEnumerable`1[TResult]..ctor (System.String directory,System.IO.Enumeration.FileSystemEnumerable`1+FindTransform[TResult] transform,System.IO.Enumerationoptions options) [0x00042] in <36514b14425c4337b446653c547aa9c3>:0 
  at System.IO.Enumeration.FileSystemEnumerableFactory.UserDirectories (System.String directory,System.String expression,System.IO.Enumerationoptions options) [0x00014] in /Users/builder/jenkins/workspace/build-package-osx-mono/2020-02/external/bockbuild/builds/mono-x64/external/corefx/src/System.IO.FileSystem/src/System/IO/Enumeration/FileSystemEnumerableFactory.cs:104 
  at System.IO.Directory.InternalEnumeratePaths (System.String path,System.String searchPattern,System.IO.SearchTarget searchTarget,System.IO.Enumerationoptions options) [0x00045] in /Users/builder/jenkins/workspace/build-package-osx-mono/2020-02/external/bockbuild/builds/mono-x64/external/corefx/src/System.IO.FileSystem/src/System/IO/Directory.cs:180 
  at System.IO.Directory.EnumerateDirectories (System.String path,System.IO.Enumerationoptions enumerationoptions) [0x00000] in /Users/builder/jenkins/workspace/build-package-osx-mono/2020-02/external/bockbuild/builds/mono-x64/external/corefx/src/System.IO.FileSystem/src/System/IO/Directory.cs:196 
  at System.IO.Directory.EnumerateDirectories (System.String path,System.IO.SearchOption searchOption) [0x00000] in /Users/builder/jenkins/workspace/build-package-osx-mono/2020-02/external/bockbuild/builds/mono-x64/external/corefx/src/System.IO.FileSystem/src/System/IO/Directory.cs:193 
  at Xamarin.Android.Tools.AndroidSdkBase.FindBestNDK (System.String androidSdkPath) [0x00038] in /Users/builder/azdo/_work/278/s/xamarin-android/external/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkBase.cs:172 
  at Xamarin.Android.Tools.AndroidSdkBase+<GetAllAvailableAndroidNdks>d__73.MoveNext () [0x000d0] in /Users/builder/azdo/_work/278/s/xamarin-android/external/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkBase.cs:164 
  at Xamarin.Android.Tools.AndroidSdkBase.GetValidNdkPath (System.String ctorParam) [0x00068] in /Users/builder/azdo/_work/278/s/xamarin-android/external/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkBase.cs:128 
  at Xamarin.Android.Tools.AndroidSdkBase.Initialize (System.String androidSdkPath,System.String androidNdkPath,System.String javaSdkPath) [0x00061] in /Users/builder/azdo/_work/278/s/xamarin-android/external/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkBase.cs:71 
  at Xamarin.Android.Tools.AndroidSdkInfo..ctor (System.Action`2[T1,T2] logger,System.String androidSdkPath,System.String javaSdkPath) [0x00025] in /Users/builder/azdo/_work/278/s/xamarin-android/external/xamarin-android-tools/src/Xamarin.Android.Tools.AndroidSdk/AndroidSdkInfo.cs:18 
  at Xamarin.Android.Tasks.MonoAndroidHelper.RefreshAndroidSdk (System.String sdkPath,System.String ndkPath,System.String javaPath,Microsoft.Build.Utilities.TaskLoggingHelper logHelper) [0x00005] in <e0b267300cf54583bbaa8d3ab5dc4081>:0 
  at Xamarin.Android.Tasks.ResolveSdks.RunTask () [0x000ac] in <e0b267300cf54583bbaa8d3ab5dc4081>:0 
  at Xamarin.Android.Tasks.AndroidTask.Execute () [0x00000] in <e0b267300cf54583bbaa8d3ab5dc4081>:0  (XARSD7023) (HangoverBusiness.Android)

然后我使用嵌入式 Jetty 设置了我的 Servlet:

public static class mybinder extends AbstractBinder {
    @Override
    protected void configure() {
      LOG.info("Attempting to configure binder");
      bindFactory(DataSourceFactory.class).to(HikariDataSource.class).in(Singleton.class);
      bindFactory(JooqConfigFactory.class).to(Configuration.class).in(Singleton.class);
      bindFactory(DSLContextFactory.class).to(DSLContext.class).in(Singleton.class);
      LOG.info("Configured binder");
    }
}

public static class DataSourceFactory implements supplier<HikariDataSource> {
    @Override
    public HikariDataSource get() {
      ...
      return new HikariDataSource(config);
    }
}

public static class JooqConfigFactory implements supplier<Configuration> {
    @Inject
    HikariDataSource dataSource;

    @Override
    public Configuration get() {
      ...   
      return conf;
    }

}

public static class DSLContextFactory implements supplier<DSLContext> {
    @Inject
    Configuration config;

    @Override
    public DSLContext get() {
      return DSL.using(config);
    }
}

在我的 Rest 服务中,我只是尝试注入一个私有实例变量:

public void start() throws Exception {
    int port = appConfig.getProperty("http.port",9998);
    Server server = new Server(port);

    ServletContextHandler ctx =
        new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
    ctx.setcontextpath("/");
    server.setHandler(ctx);
    ResourceConfig config = new JerseyConfig();
    ServletHolder servlet = new ServletHolder(new ServletContainer(config));
    servlet.setinitOrder(1);
    ctx.addServlet(servlet,"/*");

    server.start();
    server.join();
}

public static class JerseyConfig extends ResourceConfig {
    public JerseyConfig() {
      packages("com.sodonnell.jersey","jersey.config.server.provider.packages");
      register(new mybinder());
    }
}

但是这个 dslContext 总是空的。我可以从日志中看到,它打印了 public MyClass { @Inject // javax.inject.Inject private DSLContext dslContext; } 消息。然而,在我的工厂类中放置类似的日志显示它们从未被调用

有人知道我错过了什么吗?

编辑

为了让事情更简单,我创建了这个类:

LOG.info("Configured binder");

更改了我的活页夹模块:

public class SimpleClass {

  private static Logger LOG = LoggerFactory.getLogger(SimpleClass.class);

  public SimpleClass() {
    LOG.info("Call the simple class constructor");
  }

然后尝试只注入 SimpleClass:

import com.google.inject.Injector;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.glassfish.jersey.internal.inject.AbstractBinder;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.servlet.ServletContainer;
import org.jooq.Configuration;
import org.jooq.DSLContext;
import org.jooq.sqlDialect;
import org.jooq.impl.DSL;
import org.jooq.impl.DefaultConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.inject.Inject;
import javax.inject.Singleton;
import java.io.IOException;
import java.util.Properties;
import java.util.function.supplier;
...


 // This is a nested class 
 public static class mybinder extends AbstractBinder {
    @Override
    protected void configure() {
      LOG.info("Attempting to configure binder");
      bind(new SimpleClass()).to(SimpleClass.class); 
    }
  }

但它仍然为空,尽管我看到了两个日志消息。我一定缺少一些基本设置。

带有 SimpleClass 示例的完整精简代码

github.com/sodonnel/jerseyBind

解决方法

答案很简单。您正在使用 Jersey 3.0,它已切换到新的 Jakarta 命名。 javax 被抛出窗外 - 这包括 javax.inject。所有 javax 包名称现已更改为 jakarta。所以为了让注入工作,@Inject 导入应该是

import jakarta.inject.Inject;

此更改是 Java EE 更改为 Jakarta EE 的一部分,从 Jakarta EE 8 到 Jakarta EE 9,所有命名空间都从 javax 更改为 jakarta。所以像 javax.servlet 这样的东西现在变成了 jakarta.servlet。奇怪,是的,这是一个巨大的突破性变化,没有向后兼容性。

在您的情况下,您拥有与 Jakarta 一起使用的所有正确组件(即 Jersey 3.0 和 Jett 11),但您只需要使用新的命名空间。请注意,所有 JAX-RS 导入现在也是 jakarta

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。