我有一个DAO和一个Service类,它们各自实现一个接口:
public interface TemperatureDao extends GenericDAO<TemperatureLog> {
public abstract List<TemperatureLog> getLastHourTemperatures();
}
@PetiteBean(value="temperatureDao",wiring=WiringMode.AUTOWIRE)
public class TemperatureDaoImpl extends GenericAbstractDAO<TemperatureLog> implements TemperatureDao {
@Override
public List<TemperatureLog> getLastHourTemperatures(){
//do stuff here
return temps;
}
}
和
public interface TemperatureService {
public abstract boolean save(TemperatureLog t);
public abstract List<TemperatureLog> getLastHoutTemperatures();
}
@PetiteBean(value="temperatureService",wiring=WiringMode.AUTOWIRE)
public class TemperatureServiceImpl extends GenericService implements TemperatureService {
@PetiteInject
private TemperatureDao temperatureDao;
public TemperatureDao getTemperatureDao() {
return temperatureDao;
}
public void setTemperatureDao(TemperatureDao temperatureDao) {
this.temperatureDao = temperatureDao;
}
@Override
public boolean save(TemperatureLog t){
try {
temperatureDao.saveOrUpdate(t);
return true;
}catch(Exception e) {
return false;
}
}
@Override
@Transaction(propagation = JtxPropagationBehavior.PROPAGATION_REQUIRED, readOnly = true,isolation=JtxIsolationLevel.ISOLATION_READ_COMMITTED)
public List<TemperatureLog> getLastHoutTemperatures(){
return temperatureDao.getLastHourTemperatures();
}
}
,问题是,temperatureDao
没有注入,因为我得到NullPointerException
在这里:
return temperatureDao.getLastHourTemperatures();
日志看起来很好:
127 [DEBUG] j.p.PetiteBeans.registerPetiteBean:244 - Registering bean: temperatureDao of type: TemperatureDaoImpl in: SingletonScope using wiring mode: AUTOWIRE
128 [DEBUG] j.p.ProxettaBuilder.process:187 - processing: ro/videanuadrian/smartHome/dao/impl/TemperatureDaoImpl
128 [DEBUG] j.p.ProxettaBuilder.define:228 - proxy not applied ro.videanuadrian.smartHome.dao.impl.TemperatureDaoImpl
134 [DEBUG] j.p.PetiteBeans.registerPetiteBean:244 - Registering bean: temperatureService of type: TemperatureServiceImpl in: SingletonScope using wiring mode: AUTOWIRE
135 [DEBUG] j.p.ProxettaBuilder.process:187 - processing: ro/videanuadrian/smartHome/services/impl/TemperatureServiceImpl
139 [DEBUG] j.p.ProxettaBuilder.define:243 - proxy created ro.videanuadrian.smartHome.services.impl.TemperatureServiceImpl
那么,你知道我在这里错过了什么吗?
我发布了新的答案,以便更好地解释发生了什么。
这里发生的事情是,您在TemperatureServiceImpl
上创建了代理并将其注册为PetiteBean
,这是完全正确的:)因此,小型容器获得代理类,这是您的服务实现的子类。
当Petite进行连接时,它正在扫描代理类,因此,它无法在超类(即原始TemperatureServiceImpl
)中看到带注释的私有字段。
您可以通过两种方式修复此问题:
-
通过删除
private
修饰符(并使用其他任何修饰符)-容器将"看到"子类中的字段,或 -
简单地用
@PetiteInject
注释例如getTemperatureDao()
方法,并保持字段不变。
希望这解释了发生了什么。我将在即将发布的3.6版本中解决这个问题。
解决了,问题是temperatureDao
被声明为private
。