我正在开发一个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
为空...