乔德无法设法注入两个豆子

时间:2014-08-19 09:05:01

标签: jodd

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

那么,知道我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:1)

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

这里发生的是你在TemperatureServiceImpl上创建了代理并将其注册为PetiteBean,这是完全正确的:)所以,Petite容器获取代理类,这是你的子类服务实施。

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

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

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

  2. 只需注释例如使用getTemperatureDao()的{​​{1}}方法并保留字段。

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

答案 1 :(得分:0)

解决了,问题是temperatureDao被声明为private。我已将其更改为默认值,现在可以正常使用。