java - reales - No se han podido encontrar los recursos de la plantilla de velocidad
libro de android studio en español pdf (11)
Al utilizar embarcadero integrado, la propiedad webapp.resource.loader.path debe comenzar con una barra inclinada:
webapp.resource.loader.path=/templates
de lo contrario, las plantillas no se encontrarán en ../webapp/templates
Solo una aplicación independiente de velocidad simple basada en la estructura Maven. Aquí está el fragmento de código escrito en Scala para representar la plantilla helloworld.vm
en la carpeta ${basedir}/src/main/resources
:
com.ggd543.velocitydemo
import org.apache.velocity.app.VelocityEngine
import org.apache.velocity.VelocityContext
import java.io.StringWriter
/**
* @author ${user.name}
*/
object App {
def main(args: Array[String]) {
//First , get and initialize an engine
val ve = new VelocityEngine();
ve.init();
//Second, get the template
val resUrl = getClass.getResource("/helloworld.vm")
val t = ve.getTemplate("helloworld.vm"); // not work
// val t = ve.getTemplate("/helloworld.vm"); // not work
// val t = ve.getTemplate(resUrl.toString); // not work yet
//Third, create a context and add data
val context = new VelocityContext();
context.put("name", "Archer")
context.put("site", "http://www.baidu.com")
//Finally , render the template into a StringWriter
val sw = new StringWriter
t.merge(context, sw)
println(sw.toString);
}
}
cuando compilar y ejecutar el programa, recibí el siguiente error:
2012-1-29 14:03:59 org.apache.velocity.runtime.log.JdkLogChute log
严重: ResourceManager : unable to find resource ''/helloworld.vm'' in any resource loader.
Exception in thread "main" org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource ''/helloworld.vm''
at org.apache.velocity.runtime.resource.ResourceManagerImpl.loadResource(ResourceManagerImpl.java:474)
at org.apache.velocity.runtime.resource.ResourceManagerImpl.getResource(ResourceManagerImpl.java:352)
at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1533)
at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1514)
at org.apache.velocity.app.VelocityEngine.getTemplate(VelocityEngine.java:373)
at com.ggd543.velocitydemo.App$.main(App.scala:20)
at com.ggd543.velocitydemo.App.main(App.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Process finished with exit code 1
Asegúrese de tener un cargador de recursos configurado correctamente. Consulte la documentación de Velocity para obtener ayuda sobre cómo seleccionar y configurar un cargador de recursos: http://velocity.apache.org/engine/releases/velocity-1.7/developer-guide.html#resourceloaders
Enfrenté el problema similar con intellij IDEA. puedes usar esto
VelocityEngine ve = new VelocityEngine();
Properties props = new Properties();
props.put("file.resource.loader.path", "/Users/Projects/Comparator/src/main/resources/");
ve.init(props);
Template t = ve.getTemplate("helloworld.vm");
VelocityContext context = new VelocityContext();
Enfrenté un problema similar. Estaba copiando las plantillas de correo del motor de velocidad en la carpeta incorrecta. Como JavaMailSender y VelocityEngine se declaran como recursos en MailService , es necesario agregar las plantillas en la carpeta de recursos declarada para el proyecto.
Hice los cambios y funcionó. Pon las plantillas como
src/main/resources/templates/<package>/sampleMail.vm
Gran pregunta: resolví mi problema hoy de la siguiente manera usando Ecilpse:
Coloque su plantilla en la misma jerarquía de carpetas que su código fuente (no en una jerarquía de carpetas separada, incluso si la incluye en la ruta de compilación) como se muestra a continuación:
En su código, simplemente use las siguientes líneas de código (suponiendo que solo desea que la fecha pase como datos):
VelocityEngine ve = new VelocityEngine(); ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath"); ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName()); ve.init(); VelocityContext context = new VelocityContext(); context.put("date", getMyTimestampFunction()); Template t = ve.getTemplate( "templates/email_html_new.vm" ); StringWriter writer = new StringWriter(); t.merge( context, writer );
Vea cómo primero le decimos a VelocityEngine que mire en el classpath. Sin esto, no sabría dónde buscar.
Puedes usarlo así:
Template t = ve.getTemplate("./src/main/resources/templates/email_html_new.vm");
Funciona.
Puse mi .vm en src/main/resources/templates
, luego el código es:
Properties p = new Properties();
p.setProperty("resource.loader", "class");
p.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
Velocity.init( p );
VelocityContext context = new VelocityContext();
Template template = Velocity.getTemplate("templates/my.vm");
esto funciona en proyecto web.
En eclipse, Velocity.getTemplate ("my.vm") funciona porque velocidad buscará el archivo .vm en src / main / resources / o src / main / resources / templates, pero en el proyecto web, tenemos que usar Velocity.getTemplate ("templates / my.vm");
Solo una aplicación independiente de velocidad simple basada en la estructura Maven. Aquí está el fragmento de código escrito en Scala para renderizar la plantilla helloworld.vm en
${basedir}/src/main/resources folder:
También puede colocar su carpeta de plantillas en src / main / resources en lugar de src / main / java. Funciona para mí y es una ubicación preferible ya que las plantillas no son fuente de Java.
puedes intentar agregar estos códigos:
VelocityEngine ve = new VelocityEngine();
String vmPath = request.getSession().getServletContext().getRealPath("${your dir}");
Properties p = new Properties();
p.setProperty("file.resource.loader.path", vmPath+"//");
ve.init(p);
¡Hago esto y paso!
VelocityEngine velocityEngin = new VelocityEngine();
velocityEngin.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
velocityEngin.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
velocityEngin.init();
Template template = velocityEngin.getTemplate("nameOfTheTemplateFile.vtl");
podría usar el código anterior para establecer las propiedades de la plantilla de velocidad. Luego puede dar el nombre del archivo tempalte al inicializar la Plantilla y encontrará si existe en la ruta de clase.
Todas las clases anteriores provienen del paquete org.apache.velocity *