web-dev-qa-db-fra.com

Spring: comment injecter un HttpServletRequest dans un haricot à demande?

J'essaie de mettre en place un haricot à demande au printemps.

J'ai réussi à le configurer pour que le bean soit créé une fois par demande. Maintenant, il doit accéder à l'objet HttpServletRequest.

Étant donné que le bean est créé une fois par demande, je suppose que le conteneur peut facilement injecter l'objet de requête dans mon bean. Comment puis je faire ça ?

91
Leonel

Les haricots à demande peuvent être automatiquement câblés avec l'objet de demande.

private @Autowired HttpServletRequest request;
101
skaffman

Spring expose l'objet HttpServletRequest actuel (ainsi que l'objet HttpSession actuel) par l'intermédiaire d'un wrapper objet de type ServletRequestAttributes. Cet objet wrapper est lié à ThreadLocal et est obtenu en appelant la méthode static méthode RequestContextHolder.currentRequestAttributes().

ServletRequestAttributes fournit la méthode getRequest() pour obtenir la demande en cours, getSession() pour obtenir la session en cours et d'autres méthodes pour obtenir les attributs stockés dans les deux portées. Le code suivant, bien qu’un peu moche, devrait vous permettre d’obtenir l’objet de requête actuel n’importe où dans l’application:

HttpServletRequest curRequest = 
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest();

Notez que la méthode RequestContextHolder.currentRequestAttributes() renvoie une interface et doit être transtypée en ServletRequestAttributes qui l'implémente.


Spring Javadoc: RequestContextHolder | ServletRequestAttributes

124
samitgaur

Comme suggéré ici vous pouvez aussi injecter le HttpServletRequest comme paramètre de méthode, par exemple:

public MyResponseObject myApiMethod(
  ...
  HttpServletRequest request
)
0
Will Cain