NullPointerException Dao в bean

#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’ недоступно для записи или имеет недопустимый метод установки. Полное сообщение об ошибке в моем основном сообщении.