2010-01-16 7 views
1

Je veux créer un bean en utilisant BeanFactory, mais j'obtiens une exécution: java.io.FileNotFoundException: \\WEB-INF\businesscaliber-servlet.xml.Obtenir FileNotFoundException au printemps

Resource res = new FileSystemResource("//WEB-INF//businesscaliber-servlet.xml"); 
BeanFactory factory = new XmlBeanFactory(res); 
if (factory != null && beanId != null) { 
    obj = factory.getBean(beanId); 
} 

il son travail en utilisant ce

ApplicationContext CTX = new FileSystemXmlApplicationContext ("classpath *:/WEB-INF/businesscaliber-servlet.xml");

Répondre

2

Je crois que vous devez spécifier un chemin absolu et non un chemin d'accès relatif à l'application Web vers FileSystemResource. Utilisez à la place ServletContextResource.

Resource pour la mise en œuvre ServletContext ressources, interprétation des chemins relatifs dans le répertoire racine de l'application Web .

Le seul problème est que vous devez le ServletContext donc:

ServletContext servletContext = ... 
Resource res = new ServletContextResource(servletContext, 
    "/WEB-INF/businesscaliber-servlet.xml"); 
BeanFactory factory = new XmlBeanFactory(res); 
if (factory != null && beanId != null) { 
    obj = factory.getBean(beanId); 
} 

Il convient de noter que vous idéalement récupérer ce à partir d'un ApplicationContext. De 4.4 Resource Loader du Spring Reference:

Resource template = ctx.getResource("some/resource/path/myTemplate.txt); 

Que serait retourné serait un ClassPathResource; si la même méthode a été exécutée sur une instance FileSystemXmlApplicationContext , vous obtiendrez un FileSystemResource. Pour un WebApplicationContext, vous obtiendrez en arrière un ServletContextResource, et ainsi de suite. En tant que tel, vous pouvez charger des ressources d'un mode correspondant au contexte d'application particulier.

Il s'agit donc de la méthode préférée pour extraire des ressources.

Alternativement depuis /WEB-INF/ est techniquement dans le classpath, vous pouvez utiliser le préfixe classpath: (selon votre commentaire) ou utiliser ClassPathXmlApplicationContext (qui retournera automatiquement les ressources classpath).

De plus, il n'y a pas besoin de mettre des barres obliques doubles. Vous ne savez pas pourquoi vous faites cela. Peut-être un holdover de doubles barres obliques inverses, qui sont nécessaires?

+0

Est-ce la syntaxe correcte pour le nouveau ServletContextResource()? – Vicky

+0

Je suis capable de trouver la solution en utilisant ce ApplicationContext ctx = new FileSystemXmlApplicationContext ("classpath *:/WEB-INF/businesscaliber-servlet.xml"); – Vicky