2016-05-27 2 views
1

J'ai 2 @RequestMapping en dessous de la classe de contrôleur, les deux ayant HttpSession httpSession.Déclarez HttpSession globalement à la classe Controller?

Est-il possible de déclarer HttpSession httpSession globalement, de sorte que je puisse déclarer HttpSession une fois et peut être utilisé dans plusieurs fonctions?

@Controller 
public class ControllerClass{ 

    @RequestMapping(value="/sectionsAjax", method=RequestMethod.POST) 
    public @ResponseBody String sectionsAjax(HttpSession httpSession){ 
     // Code 
    } 

    @RequestMapping(value="loadAjax", method=RequestMethod.POST) 
    public @ResponseBody String sectionsAjax(HttpSession httpSession){ 
     // Code 
    } 
} 

Répondre

1

pas en cours d'exécution dans le cadre d'une demande, vous ne pouvez avoir aucune HttpSession disponible. Même dans le contexte d'une demande, il peut (encore) ne pas créer de session.

Ce qui peut s'adapter à votre cas (bien que ce ne soit pas mieux que votre approche actuelle) utilise le RequestContextHolder du printemps.

Quelque chose comme

public static HttpSession getHttpSession() { 
    ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); 
    return attr.getRequest().getSession(true); 
} 

travaillerai toujours (après avoir ajouté un chèque de getRequestAttributes ne pas retourner null) dans un conteneur de servlets (création d'une session, s'il n'y a pas).

Pour développer un peu, comme vous avez demandé à propos de l'injection (ou "déclaration globale") le HttpSession dans votre contrôleur. Les contrôleurs de Spring (c'est-à-dire les objets Java sous-jacents) sont des objets singleton très longs, ayant ce que l'on appelle "singleton scope". La session est un objet de "portée de session" donc ne peut pas être directement injectée au contrôleur (une dépendance doit être égale ou supérieure). On peut utiliser des proxies (ayant dans ce cas une portée singleton) résolvant des valeurs ayant par ex. portée de la session; mais cela ne vaut pas la peine dans votre cas. Pour plus d'informations, regardez la très bonne référence du printemps, en particulier au chapitre Bean scopes.

0

Je pense que vous pouvez lier automatiquement un HttpSession dans le contrôleur:

@Autowired 
private HttpSession session; 
+0

ya-t-il que j'ai essayé mais il donne le statut HTTP 404 au navigateur –

+0

404 dans le navigateur? Toute trace de pile? – codependent

+0

org.springframework.beans.factory.BeanCreationException: Erreur lors de la création du bean avec le nom 'ajaxFunctions': échec de l'injection de dépendances auto-générées; –