2010-08-09 16 views
17

Algo está mal y es muy frustrante. Leí en la página de inicio de velocity que cuando ejecuto una aplicación web, se deben establecer algunas propiedades. Y lo hice, pero no importa lo que haga, sigo recibiendo el mismo error.
Esto es donde hice la utilería y el uso de velocidadLa velocidad no puede encontrar el recurso

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

los archivos es, por supuesto, guardado en/WEB-INF/mailtemplates /.
Si utilizo este me sale este error:

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

Gracias por su tiempo :)

Respuesta

27

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

Le recomiendo que use el ClasspathResourceLoader, luego coloque los archivos en WEB-INF/classes, o en otro lugar en 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

+1

@Will Glass explica por favor dónde escribir tu código – gstackoverflow

1

Velocidad probablemente está usando el cargador de clases para encontrar esos archivos. Recomiendo ponerlos en WEB-INF/classes, que está en el CLASSPATH por defecto.

+1

No creo que esto funcione. WebappResourceLoader busca recursos en la raíz de la aplicación web, que desconoce ya que VelocityEngine se inicializó sin referencia al ServletContext.Estás pensando en ClasspathResourceLoader: mira mi respuesta. –

2
respuesta

Will vidrio es correcta, pero la configuración debe ser:

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

Nota del class al comienzo de la segunda línea . ¡Vea los enlaces provistos por él para más detalles!

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

0

estoy bien como sigue,

En velocity.properties archivos

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 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 insertar argumentos de VM de proyecto siga ..

-DstaticDir= "your directory for template path" 

que pueden ser útiles para usted ...

0

Para resolver este error --web-INF/classes y todos los frascos en WEB-INF/lib se encuentran en el CLASSPATH. Intente mover su carpeta con los archivos .vm en WEB-INF/classes --no ponga la ruta absoluta, por ej. si el archivo abc.vm está en la carpeta/public_html/WEB-INF, ingrese path = "/public_html/WEB-INF/abc.vm" para la ruta de la plantilla de velocidad.

Cuestiones relacionadas