0
votes

Boot de printemps - NULL AutoLiring NULL INTÉRIEUR DE LA CLASSE ABSTRACT

J'ai des cours en dessous.

Optional.ofNullable(operationMap.get("test_op1"));


5 commentaires

Pourriez-vous ajouter quelques détails à votre code: 1. Les paquets de toutes les classes que vous avez montrées et la classe de démarrage . 2. Annotation sur la classe opération .


Pouvez-vous montrer comment vous instaniez opération ?


Veuillez vous reporter à ma question mise à jour @ priyank-sriv


Veuillez vous reporter à ma question mise à jour @hasancansaral


Il n'y a pas de réponse à ma question dans votre mise à jour @ bynu022.


3 Réponses :


0
votes

Vous êtes probablement instanciant code> Opération code> avec Nouveau code> comme suit: xxx pré>

Ceci fait votre opération code > instance non-printemps gérée. Par conséquent, puisque le printemps ne sait pas de votre instance, il ne peut pas changer vos dépendances. P>

Si vous le faites: P>

@Component
public class Operation {
...
}


3 commentaires

Oui tu as raison. Je crée une nouvelle instance pour obtenir une opération connexe à partir d'une carte. Veuillez renvoyer ma question mise à jour


C'est le but. Cela répond à votre question. Le printemps ne peut pas cibler le haricot dans les instances que vous créez avec nouveau. Soit marquer comme @Component (sans Nouveau ) et AutoWire opération lui-même lorsque vous en avez besoin ou utilisez @configurable .


Avez-vous lu ma réponse? Il y a une référence à ce que vous devez faire: @configurable . Mais c'est une chose assez coûteuse à faire, et il ne s'agit pas simplement d'ajouter @configurable . Veuillez vous référer aux liens.



0
votes

Je peux voir quelques possibilités, en fonction de ce que vous avez partagé:

  1. La structure de l'emballage n'est pas correcte - si la classe Opération n'est pas dans le même package (ou un sous-package) comme classe principale , L'analyse des composants peut choisir votre classe. Veuillez vous reporter Ceci < / a> réponse pour vous assurer que vous avez correctement implémenté la structure de l'emballage.

  2. Il vous manque peut-être d'une annotation de printemps sur la classe opération , telle que @Component ou @service . Ou vous pouvez instantifier la classe manuellement dans votre code, en dehors du contexte de l'application de printemps. Veuillez vérifier que vous créez le haricot correctement.

    Si vous essayez de créer la bean manuellement, vous devriez le faire en utilisant @bean dans une classe de configuration.


0 commentaires

0
votes

Tout d'abord, ne choisissez pas une interface de classe abstraite sur lesquelles des raisons possibles: strong>

  1. Les classes abstraites ne sont pas instanciées sans une sous-classes concrètes. Ils ne seront pas enregistrés en tant que composant au printemps au moment de l'exécution. Strong> p> li>

  2. L'injection de constructeur dans des classes abstraites n'est pas supportée par le printemps. Mais, il y a deux alternatives: strong> p>

    • Injection de constructeur dans des sous-classes en béton. p> li>

    • Setter-injection dans une classe abstraite. P> li> ul> li> ol>

      Maintenant, les alternatives que vous pouvez prendre pour résoudre votre problème: p>

      Vous avez une interface et une classe avec le même nom que opération code>. Veuillez le supprimer s'il vous plaît. P>

      1ère approche: supprimez la classe abstraite et implémentez directement l'interface. Strong> p>

      mise à jour du code à ceci: p>

      public interface Operation {
          public GenericClientResponse validateCustomerId();
       }
      
       public abstract class AbstractOperation implements Operation {
      
            UserAccountsRepository userAccountsRepository;
      
            WebClient.Builder webClientBuilder; 
      
            @Autowired
            public final void setUserAccountsRepository(UserAccountsRepository userAccountsRepository) {
              this.userAccountsRepository = userAccountsRepository;
            }
      
            @Autowired
            public final void setWebClientBuilder(LogRepository webClientBuilder) {
              this.webClientBuilder = webClientBuilder;
            }
      
            public GenericClientRequest buildClientValidationRequest() {
                  return new GenericClientRequest();
            }
      
            public GenericClientResponse validateCustomerId() {
                 // code
            }
      }
      
      @Component
      public class OperationImpl extends AbstractOperation {
      
           public void someMethod() {
                userAccountsRepository.someRepositoryMethod();
           }
      
      }
      


0 commentaires