springboot + velocity + toolbox 构建项目遇到的问题

最新有朋友想让我给建一个网站。因为之前工作中使用mvc + velocity较多。之前也使用过springboot + thymeleaf ,thymeleaf的layout 使用也比较方便,boot默认视图器推荐就是thymeleaf ,但由于语法习惯,还有thymeleaf的标签库有些生疏,因此决定使用 springboot + velocity 构建。 由于springboot 已经不推荐使用velocity 所以选择 boot 1.4.2 版本

构建项目骨架的时候遇到了一些问题记录下来,以便忘记:

项目中视图使用 VelocityLayoutViewResolver作为视图处理器,看下代码:

springboot + velocity + toolbox 构建项目遇到的问题_第1张图片
VelocityLayoutViewResolver 

VelocityLayoutViewResolver继承于VelocityViewResolver 可以设置 layoutUrl

这个layoutUrl可以做什么呢:比如一个网页的基础构建可以分为 头部、左侧菜单、内容、底部。使用layout可以固定不变的地方:头部、左侧菜单、底部,内容根据view 替换layout中的内容。这样我们只关注内容页就可以了。$screen_content 即为视图替换的内容。

    

        #parse( '/templates/layout/header.vm' )

    

    

        

        #parse( '/templates/layout/left.vm' )

        

        $screen_content

    

    #parse( '/templates/layout/footer.vm' )


springboot + velocity + toolbox 构建项目遇到的问题_第2张图片
layout.vm

Velocity 配置:

springboot + velocity + toolbox 构建项目遇到的问题_第3张图片
velocity config

layoutUrl:访问layout的路径配置

toobox.xml 路径:这个路径是关键 /WEB-INF/classes/config/toolbox.xml。刚开始我的设置是/config/toolbox.xml

toolbox.xml 存放路径:

springboot + velocity + toolbox 构建项目遇到的问题_第4张图片
路径

问题来了:使用jar方式启动springboot

java.lang.NullPointerException: null at org.springframework.web.servlet.view.velocity.VelocityToolboxView.createVelocityContext(VelocityToolboxView.java:113) at org.springframework.web.servlet.view.velocity.VelocityView.renderMergedTemplateModel(VelocityView.java:290) at org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:167) at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1257) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:784) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:802) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)

空指针异常:产生的原因 加载不到toolbox.xml 但是路径没有传错 classpath:config/toolbox.xml。

springboot + velocity + toolbox 构建项目遇到的问题_第5张图片
VelocityToolboxView

看源码可知:这个路径并不是由classpathloader 加载,所以这么设置肯定不对,那jar的方式启动,由于是内置的tomcat访问路径肯定访问不到。

更换方式启动:使用独立tomcat加载war包,文件会解压到/WEB-INF/classes/config/toolbox.xml。

主要的结论说三遍:

如果使用toolboxConfigLocation,使用TOMCAT来启动,不要使用jar的方式启动。

如果使用toolboxConfigLocation,使用TOMCAT来启动,不要使用jar的方式启动。

如果使用toolboxConfigLocation,使用TOMCAT来启动,不要使用jar的方式启动。

具体的调试过程,就不发出来了,如果有兴趣可以debug跟下。

你可能感兴趣的:(springboot + velocity + toolbox 构建项目遇到的问题)