Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JDO的Guice持久性-奇怪的NPE_Java_Persistence_Guice_Jdo_Datanucleus - Fatal编程技术网

Java 使用JDO的Guice持久性-奇怪的NPE

Java 使用JDO的Guice持久性-奇怪的NPE,java,persistence,guice,jdo,datanucleus,Java,Persistence,Guice,Jdo,Datanucleus,我在桌面应用程序中使用带有JDO和Datanucleus的Guice。我面临一个无法修复的NPE,所以我希望有人能帮助我:) 我使用的是正确配置的H2DB,创建了模式,所有的类都得到了很好的增强,所以不是这样。不管怎样,我在JDORepository课堂上得到了NPE: public abstract class JdoRepository<T> implements Repository<T> { private final Class<T> clazz;

我在桌面应用程序中使用带有JDO和Datanucleus的Guice。我面临一个无法修复的NPE,所以我希望有人能帮助我:)

我使用的是正确配置的H2DB,创建了模式,所有的类都得到了很好的增强,所以不是这样。不管怎样,我在JDORepository课堂上得到了NPE:

public abstract class JdoRepository<T> implements Repository<T>
{
private final Class<T> clazz;
private final Provider<PersistenceManager> pmProvider;

protected JdoRepository(Class<T> clazz, Provider<PersistenceManager> pmProvider)
{
    this.clazz = clazz;
    this.pmProvider = pmProvider;
}
public void persist(T entity)
{
    pmProvider.get().makePersistent(entity);   <---- NPE!
}

因此,主类中的存储库绑定工作正常,因为它们被重定向到JDORepository。这是较低级别的东西,PMF没有正确绑定?有什么想法吗?

你的
main.run()
-method做什么?它是否调用
PersistenceManagerFilter#doFilter
?如果没有,则
ThreadLocal
中的值将为空

您可以覆盖
initialValue()
并执行如下操作:

ThreadLocal<PersistenceManager> pm = new  ThreadLocal<PersistenceManager>(){
    @Override
    protected PersistenceManager initialValue() {
        return JDOHelper.getPersistenceManagerFactory().getPersistenceManager();
    }
};

没有,我没有在run()方法中添加类似的内容。我所拥有的只是没有,我没有在run()方法中添加任何类似的内容。我所拥有的只是@InjectPublicRepositoryProjectRepo。。。projectRepo.persist(新项目);我真的不知道在哪里添加什么:)我想添加任何代码都需要一些替换。RequestScope不是基本的注释。隐马尔可夫模型。。。那么,您将向main.run()添加什么?对不起,我刚才假设您使用的是“guice servlet”扩展。@RequestScope注释由该扩展提供。在代码中,您可以在
doFilter
中的
ThreadLocal
中设置值。从
main#run()
调用
doFilter
,或者覆盖
ThreadLocal中的
initialValue()
,我仍然无法解决这个问题,应该把什么放在哪里。我承认这有点复杂:)为了运行doFilter,我必须用服务、请求和链来调用它,所以这很不方便。我应该在ThreadLocal中将initialValue的重写放在哪里?嗯。。。我不认为调用doFilter是个问题。我仍将在pm.get()时获取NPE。所以问题可能在其他地方。NPE将在这里:最后{pm.get().close();}
    public class GuiceModule extends AbstractModule
   {
   @Override
   protected void configure()
   {
       // Enable per-request-thread PersistenceManager injection.
       install(new PersistenceManagerFilter.GuiceModule());
       bind(new TypeLiteral<Repository<Project>>() { }).to(JdoProjectRepository.class);
Injector injector = Guice.createInjector(new GuiceModule());
    Main main = injector.getInstance(Main.class);
    main.run();
ThreadLocal<PersistenceManager> pm = new  ThreadLocal<PersistenceManager>(){
    @Override
    protected PersistenceManager initialValue() {
        return JDOHelper.getPersistenceManagerFactory().getPersistenceManager();
    }
};
class GuiceModule extends AbstractModule {

    @Provides @RequestScoped
    PersistenceManager providePersistenceManager(){
        return JDOHelper.getPersistenceManagerFactory().getPersistenceManager();
    }

    @Override
    protected void configure() {}
}