QuartzJob 中的 EntityManager 为空

EntityManager null in QuartzJob

我在 QuartzJob 实例上使用 EntityManager 时遇到了这个问题:

java.lang.NullPointerException at weblogic.persistence.CICScopedEMProvider.getEMForCurrentCIC(CICScopedEMProvider.java:35) at weblogic.persistence.TransactionalEntityManagerProxyImpl.getPersistenceContext(TransactionalEntityManagerProxyImpl.java:122) at weblogic.persistence.BasePersistenceContextProxyImpl.invoke(BasePersistenceContextProxyImpl.java:94) at weblogic.persistence.TransactionalEntityManagerProxyImpl.invoke(TransactionalEntityManagerProxyImpl.java:164) at weblogic.persistence.BasePersistenceContextProxyImpl.invoke(BasePersistenceContextProxyImpl.java:86) at com.sun.proxy.$Proxy321.createQuery(Unknown Source) at com.myproject.repository.impl.PhotoRepositoryImpl.getShotsFromBackupOption(PhotoRepositoryImpl.java:44) at com.myproject.service.impl.PhotoServiceImpl.getPhoto(PhotoServiceImpl.java:90) at com.myproject.monitor.BackupJob.execute(BackupJob.java:46) at org.quartz.core.JobRunShell.run(JobRunShell.java:202) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)

这是我的工作:

public class BackupJob implements Job{
    private Logger logger = LoggerFactory.getLogger(getClass());

    @Inject private PhotoService photoService;

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        try {
            String jobName = context.getJobDetail().getKey().getName();
            Long jobGroup = Long.parseLong(context.getJobDetail().getKey().getGroup());

            List<File> fileList = photoService.getPhoto(jobName, jobGroup);

            logger.info("Backup with deep {}", context.getJobDetail().getJobDataMap().get("deep"));
        } catch (Exception e) {
            logger.error("ERROR during backup job", e);
        }       
    }
}

(photoService 已正确注入,我在 photoService 中调用的 photoRepository 方法也是如此)

这是我的存储库:

@Stateless
public class PhotoRepositoryImpl implements PhotoRepository{

    @PersistenceContext(unitName=Constant.PU_NAME)
    private EntityManager em;

    @Override
    public List<Photo> getShotsFromBackupOption(String jobName, Long jobGroup) throws SQLException{

        Query query = em.createQuery("SELECT p "
                                    + "FROM Shot s "
                                    + "JOIN Photo p "
                                    + "WHERE s.dateShooting < "
                                        + "(SELECT b.previousThan "
                                        + "FROM BackupOption b "
                                        + "WHERE b.jobName = :jobName AND b.syncType.id = :jobGroup)"
                                    + "ORDER BY p.relativePath DESC");
        query.setParameter("jobName", jobName);
        query.setParameter("jobGroup", jobGroup);


        return (List<Photo>) query.getResultList();
    }
}

这是我的工作工厂

public class JobFactoryImpl implements JobFactory {


@Inject
private Instance<Job> jobs;

@Override
public Job newJob(TriggerFiredBundle triggerFiredBundle, Scheduler scheduler) throws SchedulerException {
    final JobDetail jobDetail = triggerFiredBundle.getJobDetail();
    final Class<? extends Job> jobClass = jobDetail.getJobClass();

    for (Job job : jobs) {
        if (job.getClass().isAssignableFrom(jobClass)) {
            return job;
        }
    }

    throw new RuntimeException("Cannot create a Job of type " + jobClass);
}}

NullPointerException 在 em.createquery(---) 方法上抛出。 当从我的 QuartzJob 中调用方法时,此查询效果很好。 您对此有什么好的解决方法吗?

我通过这种方式解决了获取 EntityManager 的问题:

@PersistenceUnit(unitName= Constant.PU_NAME)
private EntityManagerFactory emf;

private EntityManager em = emf.createEntityManager();