我正在从jetty 9迁移到jetty 10,我们正在使用google进行依赖注入。当前,guice模块如下所示:
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);
}
}我们使用这些字段注入测试类,如下所示:
public abstract class AbstractTest {
@Inject
public Configuration cfg;
@Inject
public ExportData exportData;
@Inject
protected EntityManager entityManager;
}在9号码头,一切都很好。实体管理器提供者能够查找在persistence.xml中定义的数据源。由于某些原因,这似乎不适用于第10号码头。当实体管理器提供者被调用时,它会为'NavDS‘抛出一个NameNotFoundException。
有什么原因吗?有什么迁移步骤我错过了吗?
发布于 2022-03-17 13:36:20
我设法解决了这个问题。我从未在实体管理器提供程序和数据源提供程序之间设置显式依赖。在旧的构建中,我没有使用它,因为有另一个提供程序方法确实依赖于数据源,并且该提供程序首先被注入。当我更新到新版本的guice时,有关注入顺序的内容发生了变化。
我只需将实体管理器的方法定义更改为
public EntityManager getEntityManager(Datasource ds){}一旦我这么做,代码又起作用了。
我仍然有一个问题,那就是是否有更好的方法来做到这一点。实际上,我并不在provider方法中直接使用数据源,它只需要在Hibernate进行查找之前添加到上下文中即可。是否有更好的方法来确保提供程序方法的依赖关系而不添加从未使用过的参数?
https://stackoverflow.com/questions/71444282
复制相似问题