tutorial language example java web-applications velocity

java - language - Velocity no puede encontrar recursos



velocity java (5)

Algo está mal y es muy frustrante. Leí en la página de inicio de speed que cuando ejecuto una aplicación web, se deben configurar algunas propiedades. Y lo he hecho, pero no importa lo que haga, sigo recibiendo el mismo error.
Aquí es donde pongo los puntales y uso la velocidad.

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

Por supuesto, los archivos se guardan en / WEB-INF / mailtemplates /.
Si uso esto me sale este error:

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

Gracias por tu tiempo:)


Está utilizando el recurso de recurso de la aplicación web, que está destinado a las páginas servidas por el servlet de Velocity Tools. (Requiere alguna inicialización especial para encontrar la raíz del contexto del servlet).

Le recomiendo que use ClasspathResourceLoader, luego coloque los archivos en WEB-INF / classes, o en cualquier otro lugar de su classpath. Este es realmente el enfoque más directo.

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

Más información está aquí:

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


Estoy bien como sigue,

En el archivo velocity.properties

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

Y en mi clase 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; } }

E inserte los argumentos de proyecto de VM como sigue ...

-DstaticDir= "your directory for template path"

Eso puede ser útil para usted ...


La respuesta de Will Glass es correcta, pero la configuración debe ser:

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

Note la class al comienzo de la segunda línea. Vea los enlaces proporcionados por él para más detalles !.

Nota: Hacer una respuesta en lugar de un comentario debido a privilegios.


La velocidad probablemente esté usando el cargador de clases para encontrar esos archivos. Recomiendo ponerlos en WEB-INF / classes, que está en CLASSPATH de forma predeterminada.


Para resolver este error --WEB-INF / classes y todos los archivos JAR en WEB-INF / lib están en CLASSPATH. Intente mover su carpeta con los archivos .vm en WEB-INF / classes --no ponga la ruta de abolición, por ejemplo. Si el archivo abc.vm está en la carpeta / public_html / WEB-INF, coloque path = "/public_html/WEB-INF/abc.vm" para la ruta de la plantilla de velocidad.