Spring Service类为null

时间:2016-03-24 15:20:55

标签: java spring-mvc

我正在开发一个Spring启动应用程序,但我无法理解为什么我的自动有线服务为空...

我有这个类,标有@Component注释

@Component
public class Rele {

    @SuppressWarnings("unused")
    private Pin pin;
    private GpioController gpio;
    private static GpioPinDigitalOutput relePin;
    private static final Logger logger = Logger.getLogger(Rele.class);
    private Interruttore interruttore;
    @Autowired AccensioneService accensioneService;

    public Rele(){

    }

    // Costruttore
    @SuppressWarnings("static-access")
    public Rele(Pin pin, Interruttore interruttore) {
        this.pin = pin;
        this.gpio = GpioFactory.getInstance();
        this.relePin = gpio.provisionDigitalOutputPin(pin, "MyRele", PinState.LOW);
        this.interruttore = interruttore;
    }

    public void lightOn() {
        if (relePin.isLow()) {
            relePin.high();
            updateAccensione(interruttore, true);
            logger.debug("Rele acceso");
        }
    }

    public void lightOff() {
        if (relePin.isHigh()) {
            relePin.low();
            updateAccensione(interruttore, false);
            logger.debug("Rele spento");
        }
    }

    public void updateAccensione(Interruttore interruttore, boolean acceso) {

        Date lastDateAccensione = new Date();

        try {
            logger.debug("AccensioneService is"+accensioneService.toString());
        lastDateAccensione = accensioneService.findLastDate(interruttore);
        } catch(NullPointerException npe){
            logger.debug("Accensione service è: "+accensioneService);
            logger.error("ECCOLO:", npe);
            lastDateAccensione = new Timestamp(lastDateAccensione.getTime());

        }
        Accensione accensione = new Accensione();
        Date date = new Date();
        logger.debug("lastDate:" + lastDateAccensione);
        accensione.setDateTime(new Timestamp(date.getTime()));
        accensione.setInterruttore(interruttore);
        accensione.setIsLit(acceso);
        accensione.setLastDateTime(lastDateAccensione);
        logger.debug("Accensione è:"+accensione.toString());
        accensioneService.saveAccensione(accensione);

    }
}

accensioneService使用accensioneDao在模型Accensione.java上执行基本数据库操作。使用dao / services在我拥有的每个控制器中都很好。

在这种情况下,Rele.java它不是一个@Controller注释类(因为它不是一个控制器),所以我通过@Component对它进行注释以使它被Spring扫描,但我&# 39; m总是出现NullPointerException,因为accensioneService为null。

我在另一个控制器中也使用了accensioneService,并且它正常工作,我无法理解为什么Spring在这个类中没有识别它...

感谢@Madhusudana Reddy Sunnapu我明白问题在于我是如何创建Rele对象的。现在的问题是如何更改应用程序以实现目标。

我有一个ReleManager类,它包含一个我需要知道的地图,如果已经实例化了一个特定的Rele。我在这个课程中自动使用Rele来创建它。

@Component
public class ReleManager {
    @Autowired Rele rele;
    private  final Logger logger = Logger.getLogger(ReleManager.class);
    private Map<Pin, Rele> mappa = new HashMap<Pin, Rele>();

    public  Rele getRele(Pin pin, Interruttore interruttore){
        if(mappa.containsKey(pin) && mappa.get(pin)!=null){
            logger.debug("rele già instanziato");
            return mappa.get(pin);
        } else {
            logger.debug("rele da instanziare");
        rele.setInterruttore(interruttore);
        rele.setPin(pin);
        mappa.put(pin, rele);
        return rele;
        }
    }

}

这个类用在控制器方法中,这是有趣的部分。我在这堂课中自动装配ReleManager和Rele以使用上面的地图。

rele = releManager.getRele(RaspiPin.getPinByName(relePin), interruttore);
        if(lit){
        rele.lightOn();
        } else {
        rele.lightOff();
        }

lightOn()方法在Rele.class中...现在我的NullPointerException在调用if (relePin.isLow()) {时出现,所以现在relePin为空...

0 个答案:

没有答案