web-dev-qa-db-fra.com

Le bean @Autowired est nul lorsqu'il est référencé dans le constructeur d'un autre bean

Ci-dessous, un extrait de code où je tente de référencer mon bean ApplicationProperties. Lorsque je le référence depuis le constructeur, il est null, mais lorsqu'il est référencé depuis une autre méthode, il convient. Jusqu'à présent, je n'ai eu aucun problème à utiliser ce bean autowired dans d'autres classes. Mais c'est la première fois que j'essaye de l'utiliser dans le constructeur d'une autre classe.

Dans l'extrait de code ci-dessous, applicationProperties a la valeur null lorsqu'il est appelé à partir du constructeur, mais lorsqu'il est référencé dans la méthode convert, ce n'est pas le cas. Qu'est-ce que je rate

@Component
public class DocumentManager implements IDocumentManager {

  private Log logger = LogFactory.getLog(this.getClass());
  private OfficeManager officeManager = null;
  private ConverterService converterService = null;

  @Autowired
  private IApplicationProperties applicationProperties;


  // If I try and use the Autowired applicationProperties bean in the constructor
  // it is null ?

  public DocumentManager() {
  startOOServer();
  }

  private void startOOServer() {
    if (applicationProperties != null) {
      if (applicationProperties.getStartOOServer()) {
        try {
          if (this.officeManager == null) {
            this.officeManager = new DefaultOfficeManagerConfiguration()
              .buildOfficeManager();
            this.officeManager.start();
            this.converterService = new ConverterService(this.officeManager);
          }
        } catch (Throwable e){
          logger.error(e);  
        }
      }
    }
  }

  public byte[] convert(byte[] inputData, String sourceExtension, String targetExtension) {
    byte[] result = null;

    startOOServer();
    ...

Voici l'extrait de ApplicationProperties ...

@Component
public class ApplicationProperties implements IApplicationProperties {

  /* Use the appProperties bean defined in WEB-INF/applicationContext.xml
   * which in turn uses resources/server.properties
   */
  @Resource(name="appProperties")
  private Properties appProperties;

  public Boolean getStartOOServer() {
    String val = appProperties.getProperty("startOOServer", "false");
    if( val == null ) return false;
    val = val.trim();
    return val.equalsIgnoreCase("true") || val.equalsIgnoreCase("on") || val.equalsIgnoreCase("yes");
  }
84
hairyone

Autowiring (lien à partir du commentaire Dunes) se produit après la construction d'un objet. Par conséquent, ils ne seront définis qu'une fois le constructeur terminé.

Si vous avez besoin d'exécuter du code d'initialisation, vous devriez pouvoir extraire le code du constructeur dans une méthode et l'annoter avec un @PostConstruct .

169
nicholas.hauschild

Pour que les dépendances soient injectées au moment de la construction, votre constructeur doit être marqué avec le @Autowired annoation comme ça.

@Autowired
public DocumentManager(IApplicationProperties applicationProperties) {
  this.applicationProperties = applicationProperties;
  startOOServer();
}
43
mR_fr0g