1

我有一个 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

那么,知道我在这里想念什么吗?

4

2 回答 2

1

我正在发布新答案以更好地解释发生了什么。

这里发生的是您创建了代理TemperatureServiceImpl并将其注册为PetiteBean,这是完全正确的:) 因此,Petite 容器获取代理类,它是您的服务实现的子类。

当 Petite 进行接线时,它正在扫描代理类,因此,它看不到超类中带注释的私有字段(这是原始的TemperatureServiceImpl)。

您可以通过两种方式解决此问题:

  1. 通过删除private修饰符(并使用其他任何东西) - 容器将“看到”子类中的字段,或者

  2. 简单地用字段注释 eggetTemperatureDao()方法@PetiteInject并保持原样。

希望这能解释发生了什么。我将尝试在即将发布的 3.6 版本中解决这个问题。

于 2014-08-21T08:06:26.290 回答
0

Solved, the issue was that temperatureDao was declared as private. I have change it to default and now it works.

于 2014-08-20T04:41:21.110 回答