Spring 弹簧靴石英-LazyInitializationException

Spring 弹簧靴石英-LazyInitializationException,spring,jpa,spring-boot,quartz-scheduler,Spring,Jpa,Spring Boot,Quartz Scheduler,我正试图安排一个工作使用石英在春季开机。下面是我正在使用的代码,下面是我的配置 问题:调用作业时,org.hibernate.LazyInitializationException:未能延迟初始化角色集合: HCSchedulerFactoryBean: @Autowired HCJobFactory jobFactory; @Autowired DataSource dataSource; @Autowired PlatformTransactionManager t

我正试图安排一个工作使用石英在春季开机。下面是我正在使用的代码,下面是我的配置

问题:调用作业时,org.hibernate.LazyInitializationException:未能延迟初始化角色集合:

HCSchedulerFactoryBean:

 @Autowired
  HCJobFactory jobFactory;

  @Autowired
  DataSource dataSource;

  @Autowired
  PlatformTransactionManager transactionManager;

  @Override
  public void afterPropertiesSet() throws Exception
  {
    setJobFactory( jobFactory.getJobFactory() );
    setDataSource( dataSource );
    //setTransactionManager( transactionManager );
    super.afterPropertiesSet();
  }
//工作工厂:

@Component
  public class HCJobFactory
  {
    @Autowired
    ApplicationContext applicationContext;

    public JobFactory getJobFactory()
    {
      HCSpringBeanJobFactory jobFactory = new HCSpringBeanJobFactory();
      jobFactory.setApplicationContext( applicationContext );
      return jobFactory;
    }
  }
//春天工厂

public final class HCSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware
{

  private transient AutowireCapableBeanFactory beanFactory;

  @Override
  public void setApplicationContext( final ApplicationContext context )
  {
    beanFactory = context.getAutowireCapableBeanFactory();
  }

  @Override
  protected Object createJobInstance( final TriggerFiredBundle bundle ) throws Exception
  {
    final Object job = super.createJobInstance( bundle );
    beanFactory.autowireBean( job );
    return job;
  }
}
//在Quartz中调度的调度程序作业

@SuppressWarnings( { "unchecked", "rawtypes" } )
  public Mailing saveAndScheduleMailing( Mailing mailing, Long runByUserId )
  {

    try
    {
      mailing = mailingDAO.saveMailing( mailing );

      // schedule job
      LinkedHashMap parameterValueMap = new LinkedHashMap();
      parameterValueMap.put( "mailingId", mailing.getId() );

      ProcessSchedule processSchedule = new ProcessSchedule();
      processSchedule.setStartDate( new Date() );
      processSchedule.setTimeOfDayMillis( new Long( 0 ) );

      processSchedule.setSchedulerFrequency( ScheduleFrequencyEnum.ONE_TIME_ONLY.getScheduleFrequency() );

      scheduleProcess( mailing, processSchedule, parameterValueMap, runByUserId );

      return mailing;
    }
    catch( Exception e )
    {
      logger.error( "An error occured method saveAndScheduleMailing." + "For mailingId: " + mailing.getId() );
      e.printStackTrace();
      return null;
    }

  }

  @SuppressWarnings( "rawtypes" )
  private void scheduleProcess( Mailing mailing, ProcessSchedule processSchedule, LinkedHashMap parameterValueMap, Long runByUserId )
  {
    try
    {
      JobKey jobKey = buildJobKey( mailing.getId() );
      JobDataMap triggerJobDataMap = new JobDataMap();
      triggerJobDataMap.put( RUN_BY_USER_ID_PARAM_NAME, runByUserId.toString() );
      triggerJobDataMap.put( MAILING_ID, mailing.getId() );
      JobDetail job = JobBuilder.newJob( QuartzEmailProcess.class ).withIdentity( jobKey ).storeDurably().setJobData( triggerJobDataMap ).build();

      // Define Trigger Instance
      String triggerGroupName = buildTriggerGroupName( mailing.getId() );
      String triggerName = buildTriggerName(mailing.getId());

      Trigger trigger = QuartzProcessUtil.buildTrigger( processSchedule, job, triggerName, triggerGroupName );
      Scheduler scheduler = factoryBean.getScheduler();
      scheduler.addJob( job, true );
      scheduler.scheduleJob( trigger );
    }
    catch( SchedulerException e )
    {
      e.printStackTrace();
    }
  }
//从调度程序调用的实际服务:

@Service
@Transactional
public class QuartzEmailProcess extends QuartzJobBean
{
  @Autowired
  EmailService emailService;
  private static final Logger logger = LoggerFactory.getLogger( QuartzEmailProcess.class );
  protected void executeInternal( JobExecutionContext context ) throws JobExecutionException
  {
    try
    {
      Scheduler scheduler = context.getScheduler();
      JobDetail jobDetail = context.getJobDetail();
      Long mailingId = Long.valueOf( jobDetail.getJobDataMap().get( "MailingId" ).toString() );
      emailService.sendMessage( mailingId );
    }
    catch( SchedulerException e )
    {
      e.printStackTrace();
    }
  }
与数据库交互的电子邮件服务类:并且所有类文件都在同一个项目和同一个包中

  public void sendMessage( Long mailingId )
  {
    Mailing mailing = mailingDao.getByMailingId( mailingId ); --> Getting Mailing object from DB
    EmailHeaderRequest header = buildEmailHeaderFromMailingId( mailing );

    for ( MailingRecipient recipient : mailing.getMailingRecipient() )
    {
      if ( recipient.getMailingRecipientType().equalsIgnoreCase( TO_VALUE ) && !StringUtils.isEmpty( recipient.getRecipient().getParticipant().getPrimaryEmailId() ) )
      {
        header.getRecipientEmails().clear();
        header.getRecipientEmails().put( recipient.getUserId(), recipient.getRecipient().getParticipant().getPrimaryEmailId() );
        EmailBodyRequest body = buildEmailBody( mailing.getTextCmKey(), recipient, true );
        processEmail( header, body );
      }
    }
    updateMailingStatus(mailing);
  }

    private String getUserEmailAddress( Long sender )
    {
      ApplicationUser user = userDao.findById( sender ); --> Getting user Object from DB
      Iterator<UserRole> roleIterator = user.getUserRoles().iterator(); ---------------> GETTING LAZY INITIALIZATION EXCEPTION HERE ERROR
      String emailAddress = null;

      while(roleIterator.hasNext())
      {
        UserRole role = roleIterator.next();
        if ( role.getRole().getRoleCode().equalsIgnoreCase( HCCoreConstants.PAX_VALUE ) )
        {
          emailAddress = user.getParticipant().getPrimaryEmailId();
          break;
        }
        else if ( role.getRole().getRoleCode().equalsIgnoreCase( HCCoreConstants.ADMIN_VALUE ) )
        {
          emailAddress = ldapQueryService.getByUserName( user.getUserName() ).iterator().next();
          break;
        }
      }

      return emailAddress;
  }  
public void发送消息(长邮件ID)
{
mailingmailing=mailingDao.getByMailingId(mailingId);-->从数据库获取邮件对象
EmailHeaderRequest header=buildEmailHeaderFromMailingId(邮寄);
for(MailingRecipient:mailing.getMailingRecipient())
{
if(recipient.getMailingRecipientType().equalsIgnoreCase(TO_VALUE)&&!StringUtils.isEmpty(recipient.getRecipient().getParticipant().getPrimaryEmailId())
{
header.getRecipientEmails().clear();
header.getRecipientEmails().put(recipient.getUserId(),recipient.getRecipient().getParticipant().getPrimaryEmailId());
EmailBodyRequestBody=buildEmailBody(mailing.getTextCmKey(),收件人,true);
处理电子邮件(标题、正文);
}
}
更新电子邮件状态(邮寄);
}
私有字符串getUserEmailAddress(长发件人)
{
ApplicationUser user=userDao.findById(发送方);-->Getting user Object from DB
迭代器roleIterator=user.getUserRoles().Iterator();------------->在此处获取惰性初始化异常错误
字符串emailAddress=null;
while(roleIterator.hasNext())
{
UserRole=roleIterator.next();
if(role.getRole().getRoleCode().equalsIgnoreCase(hccoreContents.PAX_值))
{
emailAddress=user.getParticipant().getPrimaryEmailId();
打破
}
else if(role.getRole().getRoleCode().equalsIgnoreCase(hccoreContents.ADMIN_值))
{
emailAddress=ldapQueryService.getByUserName(user.getUserName()).iterator().next();
打破
}
}
返回电子邮件地址;
}  
但我还是明白了这个问题。我试图将事务管理器添加到计划程序,但没有解决问题

有人能帮我吗

更新1-StackTrace

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.domain.ApplicationUser.userRoles, could not initialize proxy - no Session
    at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:575)
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:214)
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:554)
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:142)
    at org.hibernate.collection.internal.PersistentSet.iterator(PersistentSet.java:180)
    at com.email.EmailService.getUserEmailAddress(EmailService.java:152)
    at com.email.EmailService.buildEmailHeaderFromMailingId(EmailService.java:207)
    at com.email.EmailService.sendMessage(EmailService.java:78)
    at com.email.EmailService$$FastClassBySpringCGLIB$$66ae4112.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:649)
    at com.EmailService$$EnhancerBySpringCGLIB$$ed23dcaf.sendMessage(<generated>)
    at com.process.QuartzEmailProcess.executeInternal(QuartzEmailProcess.java:48)
    at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:75)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
org.hibernate.LazyInitializationException:未能延迟初始化角色集合:com.domain.ApplicationUser.userRoles,无法初始化代理-无会话
位于org.hibernate.collection.internal.AbstractPersistentCollection.ThrowlazyiInitializationException(AbstractPersistentCollection.java:575)
位于org.hibernate.collection.internal.AbstractPersistentCollection.WithTemporarySessionIneed(AbstractPersistentCollection.java:214)
位于org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:554)
位于org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:142)
位于org.hibernate.collection.internal.PersistentSet.iterator(PersistentSet.java:180)
在com.email.EmailService.getUserEmailAddress(EmailService.java:152)
在com.email.EmailService.buildEmailHeaderFromMailingId(EmailService.java:207)上
在com.email.EmailService.sendMessage上(EmailService.java:78)
在com.email.EmailService$$FastClassBySpringCGLIB$$66ae4112.invoke()上
位于org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
位于org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:649)
在com.EmailService$$EnhancerBySpringCGLIB$$ed23dcaf.sendMessage()上
位于com.process.QuartzEmailProcess.executeInternal(QuartzEmailProcess.java:48)
位于org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:75)
位于org.quartz.core.JobRunShell.run(JobRunShell.java:202)
位于org.quartz.siml.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)

我通过更改SchedulerFactoryBean解决了这个问题

@Autowired
  HCJobFactory jobFactory;

  @Autowired
  DataSource dataSource;

  @Autowired
  ApplicationContext applicationContext;


  @Override
  public void afterPropertiesSet() throws Exception
  {
    setJobFactory( jobFactory.getJobFactory() );
    setApplicationContext(applicationContext);
    setDataSource( dataSource );
    //setTransactionManager( transactionManager );
    super.afterPropertiesSet();
  }

请在原始postcan中发布例外添加stacktrace的stacktrace。请发布完整的解决方案,我无法注意到任何更改。我在SchedulerFactoryBean中添加了setApplicationContext(applicationContext)