Le printemps 3 recevoir servletContext dans la coutume de haricot
mon problème est que je ne peux pas obtenir de servletcontext dans mon haricot.
J'ai créé personnalisé bean "FileRepository" et j'ai besoin d'obtenir de ServletContext.
voici le code
package com.pc.webstore.utils;
import java.io.File;
import java.nio.file.Files;
import javax.servlet.ServletContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.ServletContextAware;
public class FileRepository implements ServletContextAware {
private ServletContext servletContext;
public String saveFile(File file){
File tempdir = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
...
}
@Override
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
}
inscription dans ApplicationContext.xml
<bean id="fileStorage" class="com.pc.webstore.utils.FileRepository"/>
quand saveFile(Fichier) démarre, j'en attente de la Nullpointerexception parce que servletContext == null.
Alors pourquoi servletcontext n'a pas injecté?
J'ai ContextLoaderListener inscrit dans web.xml
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
J'ai trouvé qu'il y a certaines étendues. Peut-être le problème est là. Dites-moi brièvement sur applicationsontext portée ou donner le lien de moyens.
Merci pour l'aide. J'ai passé beaucoup de temps à ce problème.
Après quelques debuging j'ai compris que setServletContexr méthode de servletcontextaware est en fait a été appelé lorsque l'application démarre, mais quand j'ai essayé pour stocker des fichiers avec FileRepository de mon contrôleur, il était déjà anather objet avec la valeur null servletContext champ.
Est-il un moyen juste pour autowier servlet contexte dans ma personnalisé bean quand je veux, comme dans le contrôleur?
Finalement je obtenir servletContext via ServletContextAware. Je change le chemin de la création fileRepository bean. À partir de ce
public String create(@Valid Item item, BindingResult bindingResult, Model uiModel, HttpServletRequest httpServletRequest, FileRepository fileRepository) {
à ce
@Autowired
private FileRepository fileRepository;
@RequestMapping(method = RequestMethod.POST, produces = "text/html")
public String create(@Valid Item item, BindingResult bindingResult, Model uiModel, HttpServletRequest httpServletRequest) {
OriginalL'auteur yaroslav prokipchyn | 2012-05-19
Vous devez vous connecter pour publier un commentaire.
ContextLoaderListener charge un ApplicationContext qui devient le père global contexte de l'application. Il n'y a pas de ServletContext. ServletContext n'existe que dans les (pardon, la surcharge des termes) le CONTEXTE de SERVLET - par exemple, la DispatcherServlet. Chaque DispatcherServlet (en général vous n'en possédez un) enregistre un contexte enfant qui pointe vers le père global contexte enregistré par le ContextLoaderListener. ApplicationContexts sont comme les chargeurs de classe. Lorsque le conteneur IOC va "chercher" pour un haricot, chaque ApplicationContext pouvez regarder vers le "haut" de ses parents pour essayer de le trouver, mais il ne peut pas regarder vers le bas. Les enfants peuvent également remplacer les haricots définitions de leur parent contexte.
Maintenant... il semblerait que votre problème est que votre bean est défini dans global parent contexte où il n'existe pas de ServletContext être trouvé. (Il ne peut pas regarder "vers le bas" pour ses enfants à trouver.)
Ce que vous devez faire est de déplacer le fileStorage bean définition de "descendre" dans l'ApplicationContext pour la DispatcherServlet.
Lorsque vous définissez un DispatcherServlet dans votre web.xml général, vous devez spécifier l'endroit où il peut trouver les fichiers qui définissent son enfant contexte. Comme:
Déplacer que bean définition de descendre dans l'emplacement spécifié par contextConfigLocation et tout devrait fonctionner comme prévu.
Peut-être le problème que je reçois fileRepository comme paramètre de méthode dans le contrôleur.
Réclamez-vous, vous avez maintenant DEUX instances de FileRepository? Si oui, veuillez passer en revue ce que vous faites dans le cadre de mes commentaires autour de l'ApplicationContext hiérarchie. Si un autre bean PAS défini par l'enfant, le contexte sont injectés avec un FileRepository pas définis dans le contexte enfant, que FileRepository sera toujours la pièce d'origine de votre problème. Vous devez vous assurer que TOUT ce qui dépend de la ServletContext (ou dépend de quelque chose qui en dépend, etc.) est défini à l'enfant un contexte et PAS dans le contexte parent.
MERCI pour votre aide.
Si cela a aidé, accepteriez-vous de répondre s'il vous plaît?
OriginalL'auteur Kent Rancourt