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:
- définir manuellement le haricot dans le contexte de l'application,
- 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.
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
Vous devez vous connecter pour publier un commentaire.
Lorsque vous créez un objet, par exemple, l'autowire\injecter ne fonctionnent pas...
Voir ce lien et ce lien pour certains solution de contournement.
De toute façon si vous injecter un enregistreur, je vous suggère cette ma réponse à un autre sujet.
N'est-ce pas une vraie mauvaise pratique, n'est qu'une autre façon de résoudre un problème:), mais qui sont différents côtés de la même chose 🙂 de toute façon, avez-vous pensé à injecter de l'enregistreur que je vous suggère?
OriginalL'auteur Xstian
Veux juste ajouter que mes 2 cents.
Une fois, j'ai rencontré le même problème lorsque je n'étais pas assez utilisé pour
the life in the IoC world
. Le@Autowired
champ de l'un de mes haricots est nulle au moment de l'exécution.La cause racine est, au lieu d'utiliser l'auto-créé bean maintenu par le Ressort conteneur IoC (dont
@Autowired
champ estindeed
correctement injecté), je suisnewing
ma propre instance de bean et de l'utiliser. Bien sûr, cela@Autowired
champ est nulle car le Printemps n'a aucune chance de se l'injecter.OriginalL'auteur smwikipedia
Si vous utilisez AspectJ vous pouvez utiliser
@Configurable
:Voir: À l'aide de AspectJ à la dépendance injecter des objets du domaine du Printemps
OriginalL'auteur micha
Utilisation de spring framework de test Unitaire au lieu de JUnit test afin d'injecter votre printemps bean.
Peut-être vous aider.
OriginalL'auteur Hakim Saifee
Au sein de votre contexte de l'application que vous avez à faire référence à votre Enregistreur :
Alors vous avez à injecter dans votre service :
OriginalL'auteur Abderrazak BOUADMA