2016-07-01 5 views
0

Ich schreibe jetzt einen Quarz-Job, um jeden Tag um 3:00 Uhr zu starten, um Daten in der Datenbank zu speichern und neu zu verteilen. Aber jetzt habe ich ein Problem und kann es nicht lösen, obwohl ich oft versucht habe.Warum Spring Bean kann nicht in Quarz Job injiziert werden?

Der Job:

public class QuartzScheduler implements ServletContextListener { 

private static Logger logger = Logger.getLogger(QuartzScheduler.class); 

@Autowired 
private ExchangeRateConfigBean exchangeRateConfigBean; 

private Scheduler scheduler = null; 

@Override 
public void contextInitialized(ServletContextEvent servletContext) { 

    try { 
     ExchangeRateConfig exchangeRateConfig = exchangeRateConfigBean.setUpConfigurationFromConfigFile(); 

     if(!exchangeRateConfig.getJob_fire()) { 
      logger.info("ExchangeRate Job Info: Current Exchange Rate Job flag is not open. Wont start the job!"); 
      return; 
     } 
    } catch (Exception e) { 
     logger.error("ExchangeRate Job Info: Something wrong when analyzing config.properties file!"); 
     logger.error(e.getMessage()); 
     logger.error(e.getStackTrace()); 
     logger.error(e.getCause()); 
     return; 
    } 


    try { 

     scheduler = StdSchedulerFactory.getDefaultScheduler(); 

     scheduler.start(); 

     logger.info("ExchangeRate Job Info: Exchange Rate job starting......"); 
    } catch (SchedulerException ex) { 
     logger.error(ex); 
    } 
} 

@Override 
public void contextDestroyed(ServletContextEvent servletContextEvent) { 
    try { 
     scheduler.shutdown(); 
    } catch (SchedulerException e) { 
     logger.error(e); 
    } 
} 

In diesem Job autowired ich die Komponente ExchangeRateConfigBean, aber wenn ich auf Fehler in, ich sah, dass die Instanz null ist.

die Feder Config unten:

<bean id="exchangeRateConfigBean" class="com.letv.exchangerate.bean.impl.ExchangeRateConfigBeanImpl"> 
    <constructor-arg ref="exchangeRateErrorBean" /> 
</bean> 
<bean id="exchangeRateErrorBean" class="com.letv.exchangerate.bean.impl.ExchangeRateErrorBeanImpl"> 
</bean> 

Die Config Bean unter:

public class ExchangeRateConfigBeanImpl implements ExchangeRateConfigBean { 

public ExchangeRateConfigBeanImpl(){} 

public ExchangeRateConfigBeanImpl(ExchangeRateErrorBean exchangeRateErrorBean) 
{ 
    this.exchangeRateErrorBean = exchangeRateErrorBean; 
} 

private static Logger logger = Logger.getLogger(ExchangeRateConfigBeanImpl.class.getClass()); 

private ExchangeRateErrorBean exchangeRateErrorBean; 

@Override 
public ExchangeRateConfig setUpConfigurationFromConfigFile() throws IOException { 

    InputStream inputStream = null; 
    ExchangeRateConfig exchangeRateConfig = null; 

    try { 

     Properties prop = new Properties(); 
     String propFileName = "config.properties"; 

     inputStream = getClass().getClassLoader().getResourceAsStream(propFileName); 
     exchangeRateConfig = new ExchangeRateConfig(); 

     if (inputStream != null) { 
      prop.load(inputStream); 
     } else { 
      logger.error("property file '" + propFileName + "' not found in the classpath"); 
      throw new FileNotFoundException("property file '" + propFileName + "' not found in the classpath"); 
     } 

     String job_fire_tmp = prop.getProperty("job_fire"); 
     exchangeRateConfig.setJob_fire(job_fire_tmp.isEmpty() ? false : Boolean.parseBoolean(job_fire_tmp)); 

     return exchangeRateConfig; 

    } catch (IOException e) { 
     logger.error(e.getStackTrace()); 
     return exchangeRateConfig; 
    } finally { 
     inputStream.close(); 
    } 
} 

im CONFIG bean verwendete ich den Konstruktor Injektion die Fehler bean oben zu injizieren. der Code der Fehler bean Listen unter:

public class ExchangeRateErrorBeanImpl implements ExchangeRateErrorBean{ 

public ExchangeRateErrorBeanImpl(){} 

@Override 
public ExchangeRateError getExchangeRateError(String content) { 

    if (content.isEmpty()) 
     return null; 
    if (!content.contains(":")) 
     return null; 

    String[] strArray = content.split(":"); 

    return new ExchangeRateError(strArray[0], strArray[1]); 
} 

}

Wer kann helfen? Warum habe ich die Config-Bean in der Job-Klasse autowired, es wird Null-Instanz erstellen? Danke.

Und bevor ich dies poste, habe ich das im Detail gelesen, Why is my Spring @Autowired field null? aber es hat nicht meine Zeit gerettet.

Antwort

Verwandte Themen