gpt4 book ai didi

java - Spring boot - 服务类为空

转载 作者:行者123 更新时间:2023-11-30 08:39:07 25 4
gpt4 key购买 nike

我正在使用 autoWired 服务类,它在 Spring Boot 应用程序中为空。每个对象都由 Spring 实例化,所以我不知道为什么会这样。

情况是:我有一个 Rele.java 类,如下所示:

@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 时,此值为 null。Rele 是通过此方法从 Controller 创建的

@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);

}

Rele 已创建,我在我的日志中找到它。AccensioneService是一个接口(interface),具体实现是AccensioneServiceImpl:

@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) {


}
}

我不知道是否还有其他需要。 AccensioneService 也在其他方法和 Controller 中被调用,并且它工作......只有在 Rele 内部调用时才会给我这个错误......

最佳答案

编辑添加

您必须调用 new Rele() 或其他 Rele(Pin, Interruttore ) 构造函数?如果您在代码中调用它们,则 accensioneService 将为空,因为 Spring 需要创建 bean,如果您希望将 beans Autowiring 到其中或让它 Autowiring 到其中,则不能使用其构造函数创建它 Autowiring 。如果您希望它表现得像这样,Spring 必须知道它,因此它必须在(并来自)Spring 上下文中。

在每个构造函数中放置一个日志语句,找出谁在调用它们,并修复它,这样您就可以从 Spring 获取 bean,而不是调用构造函数。

下面是旧答案

您需要发布此方法以确保:

Rele rele = releService.findByInterruttore(interruttore);

我敢打赌您是通过调用 new Rele() 在某处创建 rele,这是不正确的。您需要让 Spring 为您创建它。

您没有发布足够的代码来提供进一步的建议。

此外,您说 this is null。你在说什么这个

关于java - Spring boot - 服务类为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36282276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com