2016-03-29 16 views
0

私は、SpringブートアプリケーションではnullのautoWiredサービスクラスに住んでいます。すべてのオブジェクトはSpringによってインスタンス化されるため、なぜそれが起こるのかわかりません。スプリングブート - サービスクラスがnullです

状況は次のとおりです。 私は以下の通りです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この方法RELEが作成され

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

    } 

により、コントローラから作成され、私は私のログにそれを見つけます。

@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がインターフェイスである、それは具体的な実装がAccensioneServiceImplあるのです。 AccensioneServiceも私にこのエラーが発生しますRELE内部で呼び出さときにだけ...他の方法およびコントローラに呼ばれ、それが動作します...

+1

あなたの 'releService'はアンマネージドBeanを返すようです。 'Rele'のコンストラクタが複数あるということは、実際にはアンマネージインスタンスを作成していることを強く示唆しています。 – chrylis

答えて

1

を追加するために編集あなたはnew Rele()または他のRele(Pin, Interruttore)を呼び出すする必要がありますコンストラクタ?コード内でこれらを呼び出す場合は、スプリングがBeanを作成する必要があるため、アクセントサービスはnullになります。は、BeanをAutowiredにしたい場合、またはAutowiredにする場合はコンストラクタで作成できません。このように動作させたい場合、Springはそれについて知っていなければならないので、Springコンテキストに入っていなければなりません。

各コンストラクタにlogステートメントを置き、誰がそれらを呼び出しているかを調べて、コンストラクタを呼び出す代わりにSpringからBeanを取得できるように修正します。あなたが確認するために、この方法を掲示する必要が

以下

旧答え:

Rele rele = releService.findByInterruttore(interruttore);

私はあなたが正しくないnew Rele()を呼び出すことによってreleどこかを、作成していると思いますわ。あなたはSpringがそれを作成できるようにする必要があります。

あなたはさらなる提案をするのに十分なコードを投稿していません。

また、this is nullと言ってください。何ですかこのあなたについて話していますか?

+0

'accensioneService'はnullです。私は 'Rele rele = releService.findByInterruttore(interruttore);と呼ぶと、すぐ後にロガーが私にこのようなものを返します:' rele = it.besmart.parkserver.Rele @ b10936' ... – besmart

+0

上記の編集を参照してください – mikeb

+0

私は私を見ました私は別の問題を抱えています。SpringブートからReleを作成する方法がわからないので、彼らに 'interruttore'と' pin'を与えてしまうからです。 Rele.javaに@Beanとして注釈を付けるだけですか?それは春のブートで動作しますか? – besmart

関連する問題