Spring 弹簧靴石英-LazyInitializationException
我正试图安排一个工作使用石英在春季开机。下面是我正在使用的代码,下面是我的配置 问题:调用作业时,org.hibernate.LazyInitializationException:未能延迟初始化角色集合: HCSchedulerFactoryBean: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
@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)