2 votes

Comment ajouter @Repository à une classe non-contrôleur dans Spring ?

Je travaille sur une application Spring Boot simple qui crée et stocke des fichiers XML contenant des informations sur les licences des clients.

Mais maintenant, je voudrais ajouter un module séparé qui importe des fichiers XML similaires (qui ont été créés précédemment) dans la base de données de l'application. Pour cela, j'ai besoin d'utiliser le même référentiel qui est utilisé dans le contrôleur de l'application. Le référentiel est passé dans le constructeur du contrôleur comme suit :

@RestController
@RequestMapping("/api")
class LicenseController {

    private LicenseRepository licenseRepository;
    private UserRepository userRepository;

    public LicenseController(LicenseRepository licenseRepository,
                             UserRepository userRepository) {
        this.licenseRepository = licenseRepository;
        this.userRepository = userRepository;
    }

Vraisemblablement, l'annotation controller informe Spring-Boot de passer les référentiels au constructeur. Cependant, le module séparé utilisé pour l'importation n'est pas un contrôleur, c'est juste un POJO avec une classe principale.

Comment puis-je obtenir le dépôt de licences dans ce POJO ?

1voto

Jackkobec Points 110

Marquez votre POJO comme @Component et la DI avec constructeur sera autorisée pour LicenseRepository comme dans le code ci-dessus.

@Component // or @Service | @Repository | @Controller
class YourPOJO {
   private LicenseRepository licenseRepository;

   public YourPOJO(LicenseRepository licenseRepository) {
        this.licenseRepository = licenseRepository;
    }
}

0voto

Anish B. Points 589

Créer un Objet d'entreprise (BO) plutôt qu'une classe normale POJO ou DTO où vous pouvez avoir une méthode personnalisée pour passer le référentiel depuis votre contrôleur personnalisé.

Mais je considère quand même que c'est un mauvais design car DAO Les actions ne sont jamais effectuées dans BO , DTO y POJO car leurs travaux sont totalement différents. Je vous dirais de trouver un moyen de le faire d'une autre manière.

Pour l'exigence, ce modèle peut être repris pour l'instant.

Par exemple :

@RestController
@RequestMapping("/api")
class LicenseController {

    @Autowired
    private LicenseRepository licenseRepository;

    @Autowired
    private UserRepository userRepository;

    @RequestMapping(value="/license", method=RequestMethod.POST)
    public void storeLicense() {

      SimpleBO bo = new SimpleBO(); 
      bo.doSomethingWithLicenseRepository(licenseRepository);
      // do stuff 

    }

}

Maintenant, créez un exemple SimpleBO classe.

public class SimpleBO {

  private String someField;

  public SimpleBO() {
    super(); 
  } 

  public void doSomethingWithLicenseRepository(LicenseRepository licenseRepository) {
     .....
  }

  // getter and setters and toString() method.

}

Je pense que ça sera bien pour vous.

0voto

Byeon0gam Points 615

Et initialisera son instance en appelant la fonction @Autowired constructeur annoté.

@Service
public class UserLicenseService {

    private final LicenseRepository licenseRepository;
    private final UserRepository userRepository;

    public UserLicenseService (LicenseRepository licenseRepository, UserRepository userRepository) {
        this.licenseRepository = licenseRepository;
        this.userRepository = userRepository;
    }

    // ...
}

Contrôleur.

@RestController
@RequestMapping("/api")
class LicenseController {

    @Autowired
    private UserLicenseService userLicenseService;

    @RequestMapping(value="/license", method = RequestMethod.POST)
    public void storeLicense() {

      // using UserLicenseService.

    }

}

Principal.

ApplicationContext context = SpringApplication.run(YourMainApplication.class, args);
UserLicenseService userLicenseService = context.getBean(UserLicenseService.class);

// using UserLicenseService.

utilisation des bans de démarrage et de l'injection de dépendances

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X