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 ?
Les haricots à demande peuvent être automatiquement câblés avec l'objet de demande.
private @Autowired HttpServletRequest request;
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
Comme suggéré ici vous pouvez aussi injecter le HttpServletRequest
comme paramètre de méthode, par exemple:
public MyResponseObject myApiMethod(
...
HttpServletRequest request
)