Printemps autocâblés bean causes de pointeur null

J'ai un enregistreur de classe qui fait de l'utilisation d'un service. Chaque fois qu'un nouvel enregistreur est créé, j'attends d'avoir accès à l'singleton étendue du service de journalisation.

Je autowire le service de journalisation dans l'enregistreur toutefois, une exception de pointeur null est retourné. J'ai essayé quelques solutions:

  1. définir manuellement le haricot dans le contexte de l'application,
  2. Essayer d'obtenir de l'enregistreur de données afin de printemps et réussi, mais cela a entraîné plus de questions.

Je suis en train d'essayer d'obtenir que cela fonctionne dans mon junit tests, et je ne spécifiez le fichier de contexte pour utiliser un autre contexte de l'application. Cependant, même si elle est conservée à l'identique, il ne résout pas le problème.

Veuillez trouver le code ci-dessous:

Ce qui suit est un extrait du contexte de l'application.

<context:component-scan base-package="com.platform"/>
<bean id="asyncLoggingService" class="com.platform.services.AsyncLoggingServiceImplementation" scope="prototype"/>

Ce qui suit est l'Enregistreur de classe.

package com.platform.utils;


import com.platform.services.AsyncLoggingService;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

public class OurLogger
{

  private static Logger logger;

  @Autowired
  private AsyncLoggingervice asyncLoggingService;

  public OurLogger(Class Clazz)
  {
    logger = LoggerFactory.getLogger(Clazz);
  }


  public void trace(TraceableObject object, String message)
  { 
    //Do nothing yet
  }

}

Je puis faire usage de l'Enregistreur dans un autre service afin d'enregistrer ce qui se passe. (La raison pour laquelle je suis en train d'écrire un autre enregistreur est de rendre l'utilisation d'un serveur RabbitMQ) Dans le service j'instancie une nouvelle instance de l'Enregistreur, puis l'utiliser en conséquence.

@Service
public class AsyncAccountServiceImplementation implements AsyncAccountService
{
  private static final String GATEWAY_IP_BLOCK = "1";

  private static OurLogger logger = new      OurLogger(AsyncAccountServiceImplementation.class);

...
}

Le pointeur null se produit dans le OurLogger quand j'essaie d'appeler n'importe quelle méthode sur la asyncLoggingService.

Ensuite, je suis en train de tester la AsyncAccountService utilisation de JUnit. - Je m'assurer d'ajouter les différents contexte de l'application, mais il semble toujours à aboutir à l'exception de pointeur null.

Si vous avez besoin de plus amples informations s'il vous plaît laissez-moi savoir. J'ai vu des façons de résoudre ce problème, mais ils ne semblent pas fonctionner donc j'ai peut-être fait une erreur quelque part ou je ne suis pas la compréhension de ce tout à fait correctement.

Comment doit-printemps autowire un exemple, il ne le sait pas. Vous êtes à la création de nouvelles instances à vous-même alors que vous devez utiliser celui géré par spring.
Pour autant que je suis conscient (et s'il vous plaît corrigez-moi si je me trompe, que je suis probablement) le haricot est spécifié dans le contexte de l'application, puis utilisé (avec le même nom) dans le OurLogger instance. La seule zone grise, je vois là est la création de la nouvelle OurLogger exemple, mais il doit sûrement être ok pour utiliser un autocâblés service à l'intérieur d'une instance d'un objet comme celui-ci. Merci pour votre commentaire jusqu'à présent.
Non, il n'est pas... qui ne fonctionne Que pour le printemps définition et la gestion de haricots. Dès que vous faites un new OurLogger rien ne se passe. Sauf si vous utilisez AspectJ combiné avec @Configurable.
Mais juste par curiosité, pourquoi ne pas simplement créer un appender pour votre journalisation? De cette façon, vous pouvez simplement utiliser SLF4J dans votre code et d'avoir un RabbitMQ en fonction appender (Logback ou Log4j) pour faire l'enregistrement réel.
Il va grandement simplifier ce que vous faites. Printemps AMQP fournit un la mise en œuvre de Log4j (et je viens de m'inscrire problème pour un Logback 🙂 ).

OriginalL'auteur robinjohnobrien | 2014-09-23