struts 2を構成する.3.15+felixのウェブサイトのプロジェクトの時Template/osgi/admin/viewBundlesに出会う.ftl not foundソリューション

6055 ワード

今日はhttp://www.ibm.com/developerworks/cn/web/1007_shaobing_flexosgi/index.html?ca=drsWebプロジェクトを構成するとき、手順に従って環境を構成したことに気づいたら、tomcatを起動して以下のエラーを報告します.
java.lang.NullPointerException
    org.apache.struts2.osgi.BundleFreemarkerManager.createTemplateLoader(BundleFreemarkerManager.java:52)
    org.apache.struts2.views.freemarker.FreemarkerManager.init(FreemarkerManager.java:292)
    org.apache.struts2.views.freemarker.FreemarkerManager.getConfiguration(FreemarkerManager.java:254)
    org.apache.struts2.views.freemarker.FreemarkerResult.getConfiguration(FreemarkerResult.java:235)
    org.apache.struts2.views.freemarker.FreemarkerResult.doExecute(FreemarkerResult.java:162)
    org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186)
    com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:371)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:275)
    org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:167)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)
    org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)

ブラシをかけるとまた次のエラーが発生します.
java.io.FileNotFoundException: Template /osgi/admin/viewBundles.ftl not found.
    freemarker.template.Configuration.getTemplate(Configuration.java:580)
    freemarker.template.Configuration.getTemplate(Configuration.java:550)
    org.apache.struts2.views.freemarker.FreemarkerResult.doExecute(FreemarkerResult.java:173)
    org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186)
    com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:371)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:275)
    org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:167)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)
    org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:239)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)

まず第一の問題から原因を探します.
ソースの表示、検索
org.apache.struts2.osgi.BundleFreemarkerManager.createTemplateLoader

間違ったところは
try{
if(templatePath.startsWith("class://")) {
// substring(7) is intentional as we "reuse" the last slash
templatePathLoader = newClassTemplateLoader(getClass(), templatePath.substring(7));
} elseif(templatePath.startsWith("file://")) {
templatePathLoader = newFileTemplateLoader(newFile(URI.create(templatePath)));
}
} catch(IOException e) {
LOG.error("Invalid template path specified: "+ e.getMessage(), e);
}

ここでtemplatePathはNULLであり,異常放出をもたらす.この方法は
org.apache.struts2.views.freemarker.FreemarkerManager.init

の呼び出し、呼び出しの表示
// Process TemplatePath init-param out of order:
templatePath = servletContext.getInitParameter(INITPARAM_TEMPLATE_PATH);
if(templatePath == null) {
templatePath = servletContext.getInitParameter("templatePath");
}
config.setTemplateLoader(createTemplateLoader(servletContext, templatePath));

発見されたのはウェブですxmlの中のTemplatePathの属性の中で取ったのは、templatePathから取り出すことができなくて、2つの地方はすべて取れなくて、もう判断しないで、templatePathを呼び出します.startsWithで異常が発生しました.メソッドの最後にTemplateLoaderがNULLの場合、なぜこのように設計されたのか分からない戻り値が作成されました.
問題を見つけたら直すのはずっと簡単だ.
Webでxmlに追加
<context-param>
        <param-name>TemplatePath</param-name>
        <param-value>/osgi/admin</param-value>
</context-param>

プログラムは走り出した.

実はTemplatePathはどんな値プログラムを記入しても通れるので、理解が間違っているかどうかを見てみましょう.