2010-08-09 4 views
17

Etwas stimmt nicht und es ist sehr frustrierend. Ich habe auf der Homepage von velocity gelesen, dass wenn ich eine Webapp starte, dann sollten einige Eigenschaften eingestellt werden. Und ich habe das getan, aber egal, was ich mache, bekomme ich den gleichen Fehler.
Dies ist, wo ich die Requisiten gesetzt und die Nutzung GeschwindigkeitVelocity kann keine Ressource finden

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; 
    } 
... 
} 

Die Dateien natürlich in/WEB-INF/mailtemplates/gespeichert ist.
Wenn ich diese verwenden bekomme ich diesen Fehler:

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

Dank für Ihre Zeit danken :)

Antwort

27

Sie verwenden den Webapp-Ressourcenlader, der für Seiten vorgesehen ist, die vom Velocity Tools-Servlet bedient werden. (Es erfordert eine spezielle Initialisierung, um den Stamm des Servlet-Kontexts zu finden).

Ich empfehle, dass Sie die ClasspathResourceLoader verwenden, dann legen Sie die Dateien in WEB-INF/Klassen oder an anderer Stelle in Ihrem Klassenpfad. Dies ist wirklich der einfachste Ansatz.

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

Weitere Informationen finden Sie hier:

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

+1

@Will Glass bitte erläutern Sie, wo Sie Ihren Code schreiben können – gstackoverflow

1

Geschwindigkeit wahrscheinlich wird mit dem Class Loader, diese Dateien zu finden. Ich würde empfehlen, sie in WEB-INF/-Klassen zu setzen, die standardmäßig in CLASSPATH enthalten sind.

+1

Ich glaube nicht, dass das funktioniert. Der WebappResourceLoader sucht nach Ressourcen im Stammverzeichnis der Webanwendung, die er nicht kennt, da VelocityEngine ohne Bezug auf den ServletContext initialisiert wurde.Sie denken an den ClasspathResourceLoader - siehe meine Antwort. –

2

Will Glass Antwort ist richtig, aber die Konfiguration sein sollte:

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

Notiere die class am Anfang der zweiten Zeile . Siehe die von ihm zur Verfügung gestellten Links für weitere Details!

Hinweis: Antwort statt Kommentar aufgrund von Privilegien.

0

Ich bin fein es wie folgt,

In velocity.properties Datei

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 

Und an meinem Java-Klasse

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; 
} 
} 

Und einfügen VM Argumente Projekt folgen ..

-DstaticDir= "your directory for template path" 

, die für Sie hilfreich sein können ...

0

zur Lösung dieses Fehlers --web-INF/classes und alle JAR-Dateien in WEB-INF/lib sind im CLASSPATH. Versuchen Sie, Ihren Ordner mit den .vm-Dateien unter WEB-INF/classes zu verschieben - setzen Sie den Pfad nicht ab. Wenn sich die abc.vm-Datei im Ordner/public_html/WEB-INF befindet, geben Sie path = "/public_html/WEB-INF/abc.vm" für den Pfad der Geschwindigkeitsvorlage ein.