2010-08-09 49 views
17

Có gì đó không ổn và rất bực bội. Tôi đọc trên trang chủ của vận tốc khi tôi chạy một ứng dụng web thì một số thuộc tính nên được thiết lập. Và tôi đã làm điều đó nhưng không có vấn đề gì tôi làm tôi tiếp tục nhận được cùng một lỗi.
Đây là nơi tôi đặt đạo cụ và vận tốc sử dụngVận tốc không thể tìm thấy tài nguyên

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

Các tập tin là tất nhiên lưu trong/WEB-INF/mailtemplates /.
Nếu tôi sử dụng này, tôi nhận được lỗi này:

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

Cảm ơn bạn đã dành thời gian :)

Trả lời

27

Bạn đang sử dụng trình tải lại ứng dụng Webapp, được dành cho các trang được cung cấp bởi servocity Công cụ Velocity. (Nó đòi hỏi một số khởi tạo đặc biệt để tìm gốc của ngữ cảnh servlet).

Tôi khuyên bạn nên sử dụng ClasspathResourceLoader, sau đó đặt các tệp vào WEB-INF/classes hoặc ở nơi khác trong đường dẫn lớp của bạn. Đây thực sự là cách tiếp cận thẳng tiến nhất. Thông tin

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

hơn là ở đây:

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

+1

@Will Glass hãy giải thích nơi để viết mã của bạn – gstackoverflow

1

Velocity có lẽ bằng cách sử dụng bộ nạp lớp để tìm các tập tin. Tôi khuyên bạn nên đặt chúng trong WEB-INF/classes, mặc định trong CLASSPATH.

+1

Tôi không nghĩ rằng điều này sẽ hoạt động. WebappResourceLoader tìm kiếm các tài nguyên trong thư mục gốc của webapp mà nó không biết vì VelocityEngine đã được khởi tạo mà không cần tham chiếu tới ServletContext.Bạn đang nghĩ đến ClasspathResourceLoader - xem câu trả lời của tôi. –

2

Will Glass câu trả lời là đúng, nhưng cấu hình nên là:

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

Lưu ý class vào đầu dòng thứ hai . Xem các liên kết được cung cấp bởi anh ta để biết thêm chi tiết !.

Lưu ý: Tạo câu trả lời thay vì nhận xét do đặc quyền.

0

I am fine nó như sau,

Trong velocity.properties tập tin

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 

Và tại lớp java của tôi

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

Và chèn đối số VM của dự án như theo dõi ..

-DstaticDir= "your directory for template path" 

Đó có thể là hữu ích cho bạn ...

0

Đối với việc giải quyết các lỗi này --WEB-INF/classes và tất cả các lọ trong WEB-INF/lib đang trong CLASSPATH. Hãy thử di chuyển thư mục của bạn bằng các tệp .vm trong WEB-INF/classes - không đặt đường dẫn abolute ví dụ. nếu tệp abc.vm nằm trong thư mục/public_html/WEB-INF thì hãy đặt đường dẫn = "/public_html/WEB-INF/abc.vm" cho đường dẫn mẫu tốc độ.

Các vấn đề liên quan