首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jetty 10中的数据源注入问题

Jetty 10中的数据源注入问题
EN

Stack Overflow用户
提问于 2022-03-11 20:26:08
回答 1查看 49关注 0票数 0

我正在从jetty 9迁移到jetty 10,我们正在使用google进行依赖注入。当前,guice模块如下所示:

代码语言:javascript
复制
public abstract class GuiceModule extends AbstractModule {

    @Provides
    @Singleton
    public EntityManager getEntityManager()
    {
        PersistenceProviderResolverHolder.setPersistenceProviderResolver(new PersistenceProviderResolver() {
            private final List<PersistenceProvider> providers_ = Arrays.asList((PersistenceProvider) new HibernatePersistenceProvider());

            @Override
            public List<PersistenceProvider> getPersistenceProviders() {
            return providers_;
            }

            @Override
            public void clearCachedProviders() {
                // TODO Auto-generated method stub
                
            }
        });
            
        final EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPU");
        
        final EntityManager em = emf.createEntityManager();
        
        return em;
    }

    private static final String NAV_DS = "java:comp/env/jdbc/NavDS";
    
    @Provides
    public Context getContext() throws NamingException
    {
        if( context == null)
        {
            context = new InitialContext();  
            context.createSubcontext("java:comp/env");
            context.createSubcontext("java:comp/env/jdbc");
        }
        return context;

    }

    @Provides
    @Singleton
    public DataSource getNavDS() throws NamingException {
        
        BasicDataSource ds = new BasicDataSource();         
    ds.setUrl("jdbc:h2:mem:myDB;create=true;MODE=MSSQLServer;DATABASE_TO_UPPER=FALSE;");                        
        Context context = getContext(); 
        context.rebind(NAV_DS, ds);                                             
        return ds;
    }
    
    @Singleton
    @Provides
    public ExportData getExportData(DataSource ds)
    {
        Map<String, String> testData = new HashMap<String,String>();
        testData.put("Customer_R", "src/test/resources/nav_customers.csv");     
        return new ExportData(ds, testData);
    }
}

我们使用这些字段注入测试类,如下所示:

代码语言:javascript
复制
public abstract class AbstractTest {

    @Inject
    public Configuration cfg;
    @Inject
    public ExportData exportData;
    @Inject
    protected EntityManager entityManager;
}

在9号码头,一切都很好。实体管理器提供者能够查找在persistence.xml中定义的数据源。由于某些原因,这似乎不适用于第10号码头。当实体管理器提供者被调用时,它会为'NavDS‘抛出一个NameNotFoundException。

有什么原因吗?有什么迁移步骤我错过了吗?

EN

回答 1

Stack Overflow用户

发布于 2022-03-17 13:36:20

我设法解决了这个问题。我从未在实体管理器提供程序和数据源提供程序之间设置显式依赖。在旧的构建中,我没有使用它,因为有另一个提供程序方法确实依赖于数据源,并且该提供程序首先被注入。当我更新到新版本的guice时,有关注入顺序的内容发生了变化。

我只需将实体管理器的方法定义更改为

代码语言:javascript
复制
public EntityManager getEntityManager(Datasource ds){}

一旦我这么做,代码又起作用了。

我仍然有一个问题,那就是是否有更好的方法来做到这一点。实际上,我并不在provider方法中直接使用数据源,它只需要在Hibernate进行查找之前添加到上下文中即可。是否有更好的方法来确保提供程序方法的依赖关系而不添加从未使用过的参数?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71444282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档