0
votes

Comment accéder à @PathVariable au début de l'appel REST?

J'essaie d'accéder à une variable de chemin à partir d'une URL de requête définie au niveau de la classe du contrôleur, à partir d'une méthode annotée avec @PostConstruct. L'idée est d'utiliser cette variable de chemin pour initialiser une variable locale au début de l'appel d'API avant que la méthode de contrôleur appropriée ne soit exécutée. Ceci permet d'éviter d'avoir ce code dans chaque méthode et de laisser simplement le Le contrôleur a défini la variable au début de l'appel.

Le code pourrait mieux expliquer cela:

@RestController
@RequestMapping("/path/{variable}")
public class BaseController {

    protected Object object;

    @PostConstruct
    protected void setObject(@PathVariable("variable") Long variable){
        this.object= objectRepository.findById(variable).get();
    }
}

Évidemment, à ce stade, je suis en train de rencontrer l'annotation de la méthode du cycle de vie nécessite une erreur de méthode sans argument "- donc je sais que @PostConstruct n'est pas la voie à suivre, mais je me demande s'il existe un autre moyen d'y parvenir, peut-être quelque chose comme @Before pour les tests unitaires?

Merci d'avance!


7 commentaires

utiliser @Value et google comment l'utiliser


@AkshayBatra @ la valeur n'acceptera que la chaîne. Si vous suggérez quelque chose comme @ Value (@ pathvariable ("variable")) pour annoter la variable locale, est-il un moyen de convertir le type pathvariable en chaîne?


PathVariable n'est disponible qu'au moment de la demande de repos


@AkshayBatra Vous avez raison, @ Value n'est pas une option alors.


Votre question et vos commentaires ci-dessous indiquent que vous avez sérieusement mal compris le cycle de vie d'un @Controller . stackoverflow.com/questions/16795303 /… . La méthode @PostConstruct sera invoquée une fois lors de la création du bean et PAS avant chaque requête.


Je vote pour clore cette question comme hors sujet car elle démontre un manque fondamental de connaissance de la technologie sous-jacente.


@AlanHay Merci pour le lien de référence. Je comprends comment PostConstruct fonctionne, c'est pourquoi j'ai rejeté son utilisation dans le cadre de mon propre énoncé de problème tout en cherchant la bonne voie - je voulais juste expliquer le type de comportement que je recherchais et la première photo que j'ai prise. Le manque de connaissances, l'épuisement des résultats de recherche en ligne et le manque de temps sont exactement ce qui incite les gens à se tourner vers la communauté SO, à moins que j'aie mal compris que c'est un espace pour les experts qui nourrissent les experts. Quoi qu'il en soit, j'apprécie votre temps pour garder l'espace propre et pertinent.


3 Réponses :


0
votes

Je ne sais pas pourquoi vous en auriez réellement besoin. Pathvariable est défini en externe lors de l'appel REST. Pendant la phase de démarrage, vous ne disposez pas de cette variable de chemin, ce qui signifie que vous ne pouvez rien résoudre à partir de celle-ci.

Afin de mieux comprendre ce que vous essayez de réaliser et pourquoi cela ne fonctionne pas, je vous recommande de lire ce court article de stackoverflow: Comment fonctionne exactement le Spring BeanPostProcessor?

Si vous avez des identifiants statiques, je préférerais utiliser ConfigurationProperties.

Pouvez-vous nous donner plus d'informations sur ce que vous essayez exactement de réaliser avec cela? Personnellement, j'essaierais d'éviter les variables globales.


3 commentaires

Légèrement mis à jour mon phrasé - par initialisation, je fais référence au début de l'appel API - pas à la classe init. Si vous connaissez le fonctionnement de @Before - je recherche une fonctionnalité similaire - une méthode qui est exécutée avant que la méthode de contrôleur appropriée ne soit appelée. L'idée est d'éviter d'avoir ce morceau de code dans chaque méthode et de laisser simplement le contrôleur définir la variable au début de l'appel REST.


Eh bien @PostConstruct est appelé après avoir construit le Bean lui-même.


Pourquoi aviez-vous besoin de publier une autre réponse?



0
votes

Je n'utiliserais pas @Value Annotation car vous étendez toute la logique de configuration à travers le système. @ConfigurationProperties (voir ici: https://www.baeldung.com/configuration -properties-in-spring-boot ) serait votre ami. Vous pouvez également utiliser d'autres types d'objets ainsi que la validation en plus.

Concernant @Before des tests unitaires: @PostConstruct est appelé après avoir construit le bean lui-même, pas avant l'appel de la méthode. Si vous souhaitez faire quelque chose avant l'appel de méthode, ArgumentResolver ou un Aspect utilisant Spring AOP serait votre ami, je préférerais utiliser ArgumentResolver et tout gérer sous le capot. Encore une fois, je doute que vous fassiez réellement une conception appropriée, car @Pathvariable devrait être donnée par l'utilisateur de l'API, et non par la configuration.


0 commentaires

0
votes

Vous pouvez utiliser AOP avec @Aspect pour exécuter un morceau de code avant l'exécution de toute méthode de BaseController.

Veuillez jeter un œil pour savoir comment le mettre en œuvre. https://dzone.com/articles/aspect-oriented-programming-with- springboot


0 commentaires