EntityManager对象没有注入Glassfish和Spring

时间:2015-08-12 19:40:54

标签: java spring web-services spring-mvc glassfish

我一直在尝试创建一个删除数据库中所有记录的作业。这项工作是通过我的webservice部署的。在webservice中,我可以轻松访问我的EntityManager,到目前为止它没有任何问题。但是,每当我尝试在我的调度程序中访问EntityManager时,它就会给我NullPointerException。即使我已经尝试注入我创建的服务并尝试访问它的方法。没有数据库相关工作的方法工作正常并返回结果。但是,使用entityManager的方法给我带来了同样的异常。

如果我直接使用URL调用服务,那么一切都可以正常使用。

@Service
public class DeletionJob {

    @PersistenceContext(unitName = "my_pu")
    private EntityManager em;
    @Autowired
    private REST restClass;

    @Scheduled(fixedDelay=10000)
    public void run() {
        boolean flag = false;
        System.out.println(restClass.executeWithoutDB());
        System.out.println(restClass.executeWithDB());
    }
}

配置类:

@EnableWebMvc
@Configuration
@EnableScheduling
@ComponentScan({ "com.jobs.*" })
@javax.ws.rs.ApplicationPath("webresources")
public class AppConfig extends Application {
     @Bean
     public DeletionJob myDeletionJob() {
         return new DeletionJob();
     } 
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver 
                          = new InternalResourceViewResolver();
        return viewResolver;
    }
        @Bean
        public REST restClass(){
            return new REST(); 
        }
    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new java.util.HashSet<Class<?>>();
        addRestResourceClasses(resources);
        return resources;
    }


    /**
     * Do not modify addRestResourceClasses() method.
     * It is automatically populated with
     * all resources defined in the project.
     * If required, comment out calling this method in getClasses().
     */
    private void addRestResourceClasses(Set<Class<?>> resources) {
        resources.add(com.service.REST.class);
        // Tried to include deletionjob class here but, no luck still the same.
    // resources.add(com.jobs.DeletionJob.class);
    }
}

persistance.xml文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="my_pu" transaction-type="JTA">
    <jta-data-source>ds</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
        <property name="eclipselink.logging.level" value="FINE"/>
    </properties>
  </persistence-unit>
</persistence>

我也尝试过使用这个PersistenceAnnotationBeanPostProcessor组件。但是在包括spring-orm之后,它甚至开始给我一些BeanInitializationException。其次,我不喜欢使用太多的库。所以,想以最简单的方式做这件事。我可以通过查找JNDI来做到这一点,但问题是我想使用Spring或JAVA EE 6调度程序API。

GlassFish Server版本:4.1

1 个答案:

答案 0 :(得分:0)

@PersistenceContext在这里被忽略了。
实体管理器只能在事务内部运行的类中注入 使用EntityManagerFactory创建和销毁EntityManager。

(/ (expt 123456 123456) (expt 123456 123456))

在你的方法中使用下面的行来创建EntityManager: -

@PersistenceUnit(unitName = "my_pu")
private EntityManagerFactory entityManagerFactory;

请参阅此链接: - Injection of Persistence Context in spring

我觉得您的持久性上下文没有正确初始化。