【问题标题】:jodd cannot manage to inject two beansjodd 无法注入两个 bean
【发布时间】:2014-08-19 09:05:01
【问题描述】:

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

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

【问题讨论】:

    标签: jodd


    【解决方案1】:

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

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

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

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

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

    2. 简单地注释例如getTemperatureDao() 方法和 @PetiteInject 保持原样。

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

    【讨论】:

      【解决方案2】:

      已解决,问题是 temperatureDao 被声明为 private。我已将其更改为默认值,现在它可以工作了。

      【讨论】:

      • 嗨阿德里安!我正在尝试使用最新的代码库来重现它,它仍在使用private(应该如此:)。此外,如果您使用AUTOWIRE,则无需在现场使用@PetiteInject,因为所有内容都将自动连接。顺便说一句,您可以将AUTOWIRE设置为您的默认接线方式,这样您就不需要一直写了。无论如何,如果您有时间,请contact me,因为我想提供帮助。
      • 顺便说一句,你确定temperatureDaoTemperatureServiceImpl 中吗?从所描述的行为看来,该字段似乎是在子类中声明的?
      猜你喜欢
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多