#java #spring #nullpointerexception
#java #весна #nullpointerexception
Вопрос:
в моем веб-приложении, разработанном с помощью GWT, Hibernate и Spring, я сталкиваюсь при настройке компонента jobClass в application-context.xml файл.
Я получаю NullPointerException во время выполнения, где absenceDao
значение null:
Вот мой Java-класс :
public class ExampleJob extends QuartzJobBean {
private AbsenceDao absenceDao;
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
List untreatedDemands = new ArrayList();
untreatedDemands = absenceDao.getDemandsAskedNotValidated();
}
public AbsenceDao getAbsenceDao() {
return absenceDao;
}
public void setAbsenceDao(AbsenceDao absenceDao) {
this.absenceDao = absenceDao;
}
}
и вот мой application-context.xml :
classpath:internal.properties
<!-- Configuration du crontrigger -->
<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref local="exampleJob1" />
</property>
<property name="cronExpression">
<util:constant static-field="fr.web.utils.APP_VAR.CRON_EXPRESSION" />
</property>
</bean>
<bean id="jobClass" class="fr.web.utils.ExampleJob">
<property name="absenceDao" ref="absenceDao"/>
</bean>
<bean id="exampleJob1" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="fr.web.utils.ExampleJob" />
<property name="jobDataAsMap">
<map>
<entry key="timeout" value="5" />
</map>
</property>
</bean>
<!-- Bean containing all the properties of the application -->
<bean class="fr.web.utils.ApplicationProperties" id="applicationProperties" lazy-init="true" scope="singleton">
<constructor-arg index="0" value="classpath:internal.properties"/>
</bean>
<!-- Bean DAO -->
<bean abstract="true" id="abstractDao">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean class="fr.web.dao.AbsenceDao" id="absenceDao" parent="abstractDao"/>
</bean>
Я думал, что установки свойства, ссылающегося на Dao в компоненте jobClass, было достаточно, но, очевидно, я ошибаюсь.
Редактировать: если я устанавливаю свойство Dao в компоненте exampleJob1, я получаю эту ошибку во время выполнения :
Error 500 Error creating bean with name 'schedulerFactory' defined in class path resource [application-context.xml]:
Cannot resolve reference to bean 'cronTrigger' while setting bean property 'triggers' with key [0];
nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'cronTrigger' defined in class path resource [application-context.xml]:
Cannot resolve reference to bean 'exampleJob1' while setting bean property 'jobDetail';
nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'exampleJob1' defined in class path resource [application-context.xml]:
Error setting property values;
nested exception is org.springframework.beans.NotWritablePropertyException:
Invalid property 'absenceDao' of bean class [org.springframework.scheduling.quartz.JobDetailBean]:
Bean property 'absenceDao' is not writable or has an invalid setter method.
Does the parameter type of the setter match the return type of the getter?
Ответ №1:
Нет, вы должны установить свойство DAO в exampleJob1
конфигурации bean, чтобы ссылаться на компонент DAO.
Необходимо иметь определения bean в конфигурации приложения, но этого недостаточно. Вы также должны сообщить Spring bean factory, как соединить их вместе.
Вы могли бы добавить @Autowired
аннотацию к классу Java. Это позаботилось бы об этом, если бы у вас были включены аннотации.
Комментарии:
1. Если я установлю свойство Dao в компоненте exampleJob1, я получу сообщение об ошибке: Ошибка при создании компонента с именем ‘schedulerFactory’, определенным в пути к классу resource … … вложенным исключением является org.springframework.beans. Исключение NotWritablePropertyException: Недопустимое свойство ‘absenceDao’ класса bean [org.springframework.scheduling. кварцевый. JobDetailBean]: Свойство компонента ‘absenceDao’ недоступно для записи или имеет недопустимый метод установки. Полное сообщение об ошибке в моем основном сообщении.