Java Spring启动-服务类为空
我使用的是一个在Spring Boot应用程序中为空的自动连接服务类。。每个对象都是由Spring实例化的,所以我不知道为什么会发生这种情况 情况是: 我有一个Rele.java类,如下所示:Java Spring启动-服务类为空,java,spring,Java,Spring,我使用的是一个在Spring Boot应用程序中为空的自动连接服务类。。每个对象都是由Spring实例化的,所以我不知道为什么会发生这种情况 情况是: 我有一个Rele.java类,如下所示: @Component public class Rele { private Pin pin; private GpioController gpio; private GpioPinDigitalOutput relePin; private static final
@Component
public class Rele {
private Pin pin;
private GpioController gpio;
private GpioPinDigitalOutput relePin;
private static final Logger logger = Logger.getLogger(Rele.class);
private Interruttore interruttore;
@Autowired AccensioneService accensioneService;
public Rele(){
}
// Costruttore
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() {
try {
if (relePin.isLow()) {
relePin.high();
updateAccensione(interruttore, true);
logger.debug("Rele acceso");
}
} catch (NullPointerException e) {
logger.debug("relepin è:" +relePin);
logger.debug("gpio è:"+gpio);
}
}
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);
lastDateAccensione = accensioneService.findLastDate(interruttore);
} catch(NullPointerException npe){
logger.debug("accensioneService is: "+accensioneService);
logger.error("Error is:", 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);
}
public Pin getPin() {
return pin;
}
public void setPin(Pin pin) {
this.pin = pin;
}
public Interruttore getInterruttore() {
return interruttore;
}
public void setInterruttore(Interruttore interruttore) {
this.interruttore = interruttore;
}
public GpioPinDigitalOutput getRelePin() {
return relePin;
}
public void setRelePin(GpioPinDigitalOutput relePin) {
this.relePin = relePin;
}
public GpioController getGpio() {
return gpio;
}
public void setGpio(GpioController gpio) {
this.gpio = gpio;
}
}
尝试调用updateAccensione
时,该值为空。
通过此方法,从控制器创建REL
@RequestMapping(value="/illuminazione")
public ResponseEntity<Illuminazione> findIlluminazione(@RequestParam(value="idLuce") int idLuce,
@RequestParam(value="lit") boolean lit,
@RequestParam(value="suServer") boolean suServer) {
Illuminazione illuminazione = new Illuminazione();
Date lastDate = illuminazioneService.findLastDate(idLuce);
illuminazione.setLastDateTime(lastDate);
illuminazione.setIdLuce(idLuce);
illuminazione.setIsLit(lit);
Date date = new Date();
illuminazione.setDateTime(new Timestamp(date.getTime()));
illuminazioneService.saveIlluminazione(illuminazione);
logger.debug("Aggiornata luce " + idLuce + " accesa: "+lit);
//managing rele
if(suServer){
//check if status has changed
Luce luce = luceService.findById(idLuce);
int idInterruttore = luce.getInterruttore().getIdInterruttore();
Interruttore interruttore = interruttoreService.findById(idInterruttore);
Rele rele = releService.findByInterruttore(interruttore);
logger.debug("rele="+rele.toString());
if(lit){
rele.lightOn();
} else {
rele.lightOff();
}
}
return new ResponseEntity<Illuminazione>(illuminazione,HttpStatus.OK);
}
我不知道还需要什么。AccensioneService也在其他方法和控制器中调用,它可以。。。只有在Rele内部调用时,才会出现此错误…编辑以添加 您必须调用
new Rele()
或另一个Rele(Pin,Interruttore)
构造函数?如果您在代码中调用这些函数,accensioneService将为null,因为Spring需要创建bean,如果您希望bean自动连接到它或使它自动连接,则无法使用其构造函数创建它。如果您希望它像这样运行,Spring必须知道它,因此它必须处于(并且来自)Spring上下文
在每个构造函数中放置一个log语句,找出调用它们的人,并修复这个问题,这样就不用调用构造函数,而是从Spring获得bean
下面的旧答案
您需要发布此方法以确保:
Rele-Rele=releService.findByInterruttore(interruttore);
我敢打赌,通过调用new rele()
,您肯定在某处创建了rele
,这是不正确的。您需要让Spring为您创建它
您没有发布足够的代码来提供进一步的建议
另外,你说
这是null
。你说的这是什么?你的releService
似乎返回了一个非托管bean。你有多个Rele
构造函数这一事实强烈表明你实际上在创建非托管实例。ackensoneservice
是null。当我调用Rele Rele=releService.findByInterruttore(interruttore)不久之后,记录器会返回如下内容:rele=it.besmart.parkserver。Rele@b10936
…我看到我在另一个类中创建新的rele,你是对的,现在我有另一个问题,因为我不知道如何从Spring Boot创建rele,给他们一个中断
和一个pin
.Simply将Rele.java注释为@Bean?它与Spring boot一起工作吗?这是一个单独的问题,但是是的,您应该能够做到。您还可以创建一个支持Spring的工厂,它将为您创建Rele
类并进行注入。有很多方法。如果您有新的SO问题,请发布一个新的SO问题。
@Service("accensioneService")
@Transactional
public class AccensioneServiceImpl implements AccensioneService{
@Autowired AccensioneDao dao;
@Override
public void saveAccensione(Accensione accensione) {
dao.saveAccensione(accensione);
}
@Override
public Accensione findById(int id) {
return dao.findById(id);
}
@Override
public Date findLastDate(Interruttore interruttore) {
return dao.findLastDate(interruttore);
}
@Override
public boolean findLastStatus(int id) {
return dao.findLastStatus(id);
}
@Override
public void updateAccensione(Interruttore interruttore) {
}
}