2010-08-02 5 views
1

J'ai une classe qui doit être initialisée avec un chemin d'accès absolu. La chose que je veux initialiser avec le nom de chemin est un fichier dans WEB-INF. J'utilise le ContextLoaderListener de Spring pour mettre tout cela en mouvement, donc je ne peux pas exécuter de code Java pour obtenir le chemin du contexte et le coller où $ {whatever} pourrait le trouver.Comment définir une propriété au printemps à un chemin d'accès à l'intérieur de WEB-INF?

Tenir compte une définition de haricots comme:

<bean class="my.class"> 
    <property name="somePath" value="/WEB-INF/a.txt"/> 
</bean> 

je besoin d'un moyen, si possible, de faire ce chemin passe par le mécanisme de ServletContextResource. Il ne semble pas y avoir de 'préfixe' pour ceux comme classpath:

Dans ce cas, il ne sera pas utile d'avoir l'élément dans le classpath, croyez-moi.

EDIT:

je suis allé et déterré la source de la classe de haricots, et il accepte déjà des ressources sur les propriétés pertinentes. Donc, quelque chose de ridicule se passe ici, dans la mesure où il se plaint comme s'il ne pouvait pas trouver les choses. Off pour le débogueur pour moi.

EDIT DE NOUVEAU:

Donc, cela se révèle être un canular Maven, sans rapport au printemps. C'est upvotes tout autour de votre aide, et ouvrez une autre question.

Répondre

3

Ma préférence serait de modifier cette classe pour prendre un Resource, plutôt qu'un chemin d'accès. Vous pouvez ensuite l'injecter à l'aide:

<property name="fileResource" value="/WEB-INF/path/to/file"/> 

Ceci est plus flexible, et vous pouvez utiliser les différentes méthodes sur l'interface Resource pour obtenir des choses comme le chemin de fichier sous-jacent, comme getFile().getAbsolutePath().

Toutefois, si la modification de la classe cible n'est pas possible, vous devez convertir un Resource en un chemin d'accès. Vous pouvez utiliser un FactoryBean pour cela, quelque chose comme:

public class ResourcePathFactoryBean extends AbstractFactoryBean<String> { 

    private Resource resource; 

    @Required 
    public void setResource(Resource resource) { 
     this.resource = resource; 
    } 

    @Override 
    protected String createInstance() throws Exception { 
     return resource.getFile().getAbsolutePath(); 
    } 

    @Override 
    public Class<?> getObjectType() { 
     return String.class; 
    } 
} 

Vous pouvez alors l'utiliser pour injecter votre chemin:

<bean id="myBean" class="com.MyBean"> 
    <property name="path"> 
     <bean class="com.ResourcePathFactoryBean"> 
     <property name="resource" value="/WEB-INF/path/to/file"/> 
     </bean> 
    </property> 
</bean> 
1

Le fichier se trouve-t-il sur le chemin de classe?

Dans votre haricot, vous pourriez avoir une propriété telle que Resource fileResource, puis le mettre dans votre haricot comme

<property name="fileResource" value="classpath:/path/to/the/file"/> 

Le printemps Resource interface a une méthode nommée getFile(), qui renvoie un descripteur de fichier pour la ressource . De là, vous pouvez simplement appeler File.getAbsolutePath().

+0

Non classpath. Je m'attends à ce que ServletContextResource soit utilisé pour la valeur de la propriété car il s'agit d'un contexte WebApp, mais pas de chance. Peut-être parce que la propriété (qui n'est pas sous mon contrôle) est une chaîne et non un fichier. – bmargulies

Questions connexes