web-dev-qa-db-fra.com

Velocity ne trouve pas de ressource

Quelque chose ne va pas et c'est très frustrant. J'ai lu sur la page d'accueil de Velocity que lorsque je lance une application Web, certaines propriétés doivent être définies. Et je l'ai fait mais peu importe ce que je fais, je continue à avoir la même erreur. 
C’est là que je règle les accessoires et utilise la vélocité

public class ConfirmationMailGenerator implements MailGenerator {

    private BasicUser user;
    private String htmlTemplate = "HTMLConfirmationMailTemplate.vsl";
    private String plainTemplate = "PlainConfirmationMailTemplate.vsl";

    public ConfirmationMailGenerator(BasicUser user) {
        this.user = user;
    }

    public StringWriter generateHTML() throws Exception {
        Properties props = new Properties();
        props.setProperty("resource.loader", "wepapp");
        props.setProperty("webapp.resource.loader.class", "org.Apache.velocity.tools.view.WebappResourceLoader");
        props.setProperty("webapp.resource.loader.path", "/WEB-INF/mailtemplates/");
        VelocityEngine engine = new VelocityEngine(props);
        VelocityContext context = new VelocityContext();

        engine.init();

        Map map = createDataModel();
        context.put("user", map);

        Template template = engine.getTemplate(htmlTemplate);
        StringWriter writer = new StringWriter();
        template.merge(context, writer);

        return writer;
    }
...
}

Les fichiers sont bien sûr enregistrés dans/WEB-INF/mailtemplates /. 
Si j'utilise ceci, j'obtiens cette erreur:

SEVERE: ResourceManager : unable to find resource 'HTMLConfirmationMailTemplate.vsl' in any resource loader.
SEVERE: The log message is null.

Merci pour votre temps:)

17
AnAmuser

Vous utilisez le chargeur de ressources Webapp, qui est destiné aux pages servies par le servlet Velocity Tools. (Il faut une initialisation spéciale pour trouver la racine du contexte de servlet).

Je vous recommande d'utiliser ClasspathResourceLoader, puis de placer les fichiers dans WEB-INF/classes ou ailleurs dans votre chemin d'accès aux classes. C'est vraiment l'approche la plus simple.

resource.loader = class
class.resource.loader.class = org.Apache.velocity.runtime.resource.loader.ClasspathResourceLoader

Plus d'informations sont ici:

https://velocity.Apache.org/engine/1.7/apidocs/org/Apache/velocity/runtime/resource/loader/ClasspathResourceLoader.html

27
Will Glass

Will Glass répondra-t-il correctement, mais la configuration devrait être:

resource.loader = class
class.resource.loader.class = org.Apache.velocity.runtime.resource.loader.ClasspathResourceLoader

Notez la class au début de la deuxième ligne. Voir les liens fournis par lui pour plus de détails!.

Remarque: Faire une réponse au lieu d'un commentaire en raison de privilèges.

2
Javier Mr

Velocity utilise probablement le chargeur de classes pour trouver ces fichiers. Je recommanderais de les mettre dans WEB-INF/classes, qui est dans le CLASSPATH par défaut.

1
duffymo

Je vais bien comme suit,

Dans velocity.properties fichier

resource.loader=class, file
class.resource.loader.class=org.Apache.velocity.runtime.resource.loader.ClasspathResourceLoader
file.resource.loader.class=org.Apache.velocity.runtime.resource.loader.FileResourceLoader
file.resource.loader.path=vm_template
runtime.log.logsystem.class=org.Apache.velocity.runtime.log.SimpleLog4JLogSystem
runtime.log.logsystem.log4j.category=velocity
input.encoding=UTF-8
output.encoding=UTF-8

Et à ma classe de Java

import Java.io.StringWriter;
import Java.util.Properties;
import org.Apache.log4j.Logger;
import org.Apache.velocity.Template;
import org.Apache.velocity.VelocityContext;
import org.Apache.velocity.app.Velocity;
import org.Apache.velocity.exception.ParseErrorException;
import org.Apache.velocity.exception.ResourceNotFoundException;
import org.Apache.velocity.tools.generic.DateTool;
import org.Apache.velocity.tools.generic.EscapeTool;
import org.Apache.velocity.tools.generic.LoopTool;
import org.Apache.velocity.tools.generic.MathTool;
import org.Apache.velocity.tools.generic.NumberTool;
import org.Apache.velocity.tools.generic.SortTool;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

public class VelocitySupport implements InitializingBean {
private static Logger log = Logger.getLogger(VelocitySupport.class);

@Autowired private Properties properties;

public final void afterPropertiesSet() throws Exception {
    location = location.replace("classpath:", "");
    Resource res = new ClassPathResource(location);

    Properties prop = new Properties();
    prop.load(res.getInputStream());

    String staticDir = System.getProperty("staticDir");
    String tempPath = prop.getProperty("file.resource.loader.path");
    tempPath = staticDir + "/" + tempPath;

    prop.setProperty("file.resource.loader.path", tempPath);
    Velocity.init(prop);
}

public static String merge(final String template, final VelocityContext vc) throws Exception {
    try {
        vc.put("date", new DateTool());
        vc.put("escape", new EscapeTool());
        vc.put("math", new MathTool());
        vc.put("number", new NumberTool());
        vc.put("iterate", new LoopTool());
        vc.put("sort", new SortTool());

        Template temp = Velocity.getTemplate(template);

        StringWriter sw = new StringWriter();
        temp.merge(vc, sw);
        sw.flush();

        return sw.toString();
    }
    catch (ResourceNotFoundException e) {
        log.error("", e);
        throw e;
    }
    catch (ParseErrorException e) {
        log.error("", e);
        throw e;
    }
}

private String location;

public final void setLocation(final String location) {
    this.location = location;
}
}

Et insérez VM arguments du projet comme suit.

-DstaticDir= "your directory for template path"

Cela peut vous être utile ...

0
Cataclysm

Pour résoudre cette erreur - WEB-INF/classes et tous les fichiers JAR de WEB-INF/lib sont dans CLASSPATH. Essayez de déplacer votre dossier avec les fichiers .vm sous WEB-INF/classes - ne mettez pas le chemin absolu, par exemple. si le fichier abc.vm se trouve dans le dossier/public_html/WEB-INF, indiquez path = "/public_html/WEB-INF/abc.vm" pour le chemin du modèle de vélocité.

0
Arpit Agarwal