我正在用maven在弹簧上做一个应用程序.我在app.properties文件中写了所有属性
文件结构是这样的
src/main/resource |_ | templates | |_mytempaltefile.vm |_ app.properties
我在app.property中给出了路径(absloute)
app.properties文件
template.base.path=D\:/SVN/trunk/tfbdirect/src/main/resources/templates
公用事业,spring.xml
file org.apache.velocity.runtime.resource.loader.FileResourceLoader ${template.base.path} false
我的课
import java.util.HashMap; import java.util.Map; import org.apache.velocity.app.VelocityEngine; import org.springframework.ui.velocity.VelocityEngineUtils; import com.providerpay.tfbdirect.service.mail.MailSenderService; public class LoginServiceImpl implements ILoginService{ /** * Injected through Spring IOC */ ILoginDAO loginDAO; ClaimRuleProcessServiceImpl claimRuleProcessServiceImpl; PlatformTransactionManager txmanager; //IForgotPasswordDAO forgotPasswordDAO; private VelocityEngine velocityEngine; private String appURL; private MailSenderService mailSenderService; TFBLogger log = TFBLoggerFactory.getLogger(RuleServer.class); public String getAppURL() { return appURL; } public void setAppURL(String appURL) { this.appURL = appURL; } public MailSenderService getMailSenderService() { return mailSenderService; } public VelocityEngine getVelocityEngine() { return velocityEngine; } public void setVelocityEngine(VelocityEngine velocityEngine) { this.velocityEngine = velocityEngine; } public void setMailSenderService(MailSenderService mailSenderService) { this.mailSenderService = mailSenderService; } public ILoginDAO getLoginDAO() { return loginDAO; } public void setLoginDAO(ILoginDAO loginDAO) { this.loginDAO = loginDAO; } public ClaimRuleProcessServiceImpl getClaimRuleProcessServiceImpl() { return claimRuleProcessServiceImpl; } public void setClaimRuleProcessServiceImpl( ClaimRuleProcessServiceImpl claimRuleProcessServiceImpl) { this.claimRuleProcessServiceImpl = claimRuleProcessServiceImpl; } public void setTxmanager(PlatformTransactionManager txmanager) { this.txmanager = txmanager; } /** * Validates Login * @param loginView * @return */ public boolean isValidLogin(LoginView loginView) { /* create tx definition object */ DefaultTransactionDefinition paramTransactionDefinition = new DefaultTransactionDefinition(); TransactionStatus status = txmanager.getTransaction(paramTransactionDefinition ); boolean result = false; try{ LoginEntity loginEntity = BeanMapper.INSTANCE.viewToEntityMapper(loginView); Feedback feedback = claimRuleProcessServiceImpl.validateClaimEligibility(loginEntity); log.info( "Rule executed was " +feedback.getAll()); for (FeedbackMessage feedbackmessaage :feedback.getAll()) { log.info("\n--------------"); log.info(feedbackmessaage.getRuleCd()); log.info(feedbackmessaage.getMessage()); log.info(feedbackmessaage.getSeverity().getName()); log.info("\n--------------"); } result = loginDAO.isValidLogin(loginEntity); log.debug("result = {}", result); txmanager.commit(status); }catch(Exception e){ txmanager.rollback(status); throw new TfbException("Error occured while validating login credentials"); } return result; } @Autowired VelocityEngine velocityengine; public boolean mailResetLink(LoginView loginView) { String toEmailAddress; LoginEntity loginEntity = BeanMapper.INSTANCE.viewToEntityMapper(loginView); /* getting user Email from DAO*/ toEmailAddress = loginDAO.getEmailByUsername(loginEntity); if(toEmailAddress != null && toEmailAddress.trim().length() > 0) { Mapmodel = new HashMap (); model.put("user", loginEntity); model.put("appURL", appURL); String body = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "emailTemplate.vm","UTF-8", model); mailSenderService.sendMail("from mail", toEmailAddress, "Password Reset Link",body); } else { return false; } return true; } public boolean resetPassword(LoginView loginView) { LoginEntity loginEntity = BeanMapper.INSTANCE.viewToEntityMapper(loginView); return loginDAO.resetPassword(loginEntity); } }
一切都很好,但我需要改变相对路径的绝对路径..我尝试了很多方法.
我试着跟随
template.base.path=/templates/
但仍然低于错误.
ResourceManager:无法在任何资源加载器中找到资源'emailTemplate.vm'.
谁能帮我..
提前致谢
我最近遇到了与karaf OSGi框架相同的问题.在CXF资源类(在此上下文中登录)中,您必须像这样初始化Velocity Engine:
public Login() { /* first, get and initialize an engine */ ve = new VelocityEngine(); ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath"); ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName()); ve.init(); }
然后,在Web方法中,实例化模板:
/* create a context and add data */ synchronized (initLock) { if (loginTemplate == null) { loginTemplate = ve.getTemplate("templates/login.vm"); } } VelocityContext context = new VelocityContext();
不幸的是,ve.init()
在构造函数中调用之后立即加载模板并没有用.
使用带弹簧的速度时,您会遇到一个常见的陷阱:将模板放在一个位置,并使用资源加载器在另一个位置搜索它们.所以你有两个常见的用法:
将模板放在类路径中(就像你一样)并使用 ClasspathResourceLoader
resource.loader = class class.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
它很简单,依赖性很小,但它会强制你将模板放在类路径中......
把模板放在WEB-INF
(就像你对JSP一样)并使用WebappResourceLoader
速度工具
resource.loader=webapp webapp.resource.loader.class=org.apache.velocity.tools.view.WebappResourceLoader webapp.resource.loader.path=/WEB-INF/velocity/
对于模板位置来说更自然,但是您需要添加对速度工具的依赖性.
让spring管理依赖关系,但不要通过new
...