【问题标题】:reading manifest file from inside a war file produces error in tomcat 7从war文件中读取清单文件会在tomcat 7中产生错误
【发布时间】:2015-08-19 17:27:32
【问题描述】:

我使用 IntelliJ Idea 在 Windows 7 系统上构建了一个 Web 应用程序,并在 Tomcat 8.0 中运行它。 Web 应用程序正确读取清单文件并显示正确的属性。在我在 Ubuntu 14 和 Tomcat 7 上运行的网络服务器上,但是有一个奇怪的例外:

javax.el.ELException: Cannot convert Build-Name of type class java.lang.String to class java.util.jar.Attributes$Name
at org.apache.el.lang.ELSupport.coerceToType(ELSupport.java:419)
at org.apache.el.ExpressionFactoryImpl.coerceToType(ExpressionFactoryImpl.java:46)
at javax.el.BeanELResolver.invoke(BeanELResolver.java:469)
at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:161)
at org.apache.el.parser.AstValue.getValue(AstValue.java:172)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
at javax.faces.component.UIComponentBase$AttributesMap.get(UIComponentBase.java:2414)
at net.bootsfaces.render.RBadge.encBegin(RBadge.java:46)
at net.bootsfaces.component.Badge.encodeBegin(Badge.java:63)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:302)
at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
at javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:456)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:133)
at org.ocpsoft.rewrite.faces.RewriteViewHandler.renderView(RewriteViewHandler.java:186)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.ocpsoft.rewrite.servlet.RewriteFilter.doFilter(RewriteFilter.java:205)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:486)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:411)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:338)
at org.ocpsoft.rewrite.servlet.impl.HttpRewriteResultHandler.handleResult(HttpRewriteResultHandler.java:41)
at org.ocpsoft.rewrite.servlet.RewriteFilter.rewrite(RewriteFilter.java:268)
at org.ocpsoft.rewrite.servlet.RewriteFilter.doFilter(RewriteFilter.java:188)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:193)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

我在 *.xhtml 文件中的 el 代码:

#{cic.manifest.mainAttributes.getValue('Build-Name')}

我的java-bean-code(我想,我是从stackoverflow中使用的,但是再次查找后没有找到源代码):

@ManagedBean(name = "cic")
@ApplicationScoped
public class ConfigurationInformationController {
private static final Logger LOGGER = LogManager.getLogger(ConfigurationInformationController.class.getName());
    private Manifest manifest = null;
    public Manifest getManifest() {
        return manifest;
    }

    @PostConstruct
    public void init() {
        File manifestFile = null;
        try {
            String home = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/");
            manifestFile = new File(home, "META-INF/MANIFEST.MF");
            manifest = new Manifest();
            manifest.read(new FileInputStream(manifestFile));
        } catch (IOException ioe) {
            LOGGER.error("Unable to read the Manifest file from '"+manifestFile.getAbsolutePath()+"'",ioe);
        }
    }
}

我最初认为这是 servlet 3.0 和 3.1 规范的差异,但我没有发现有关规范和我的问题的任何信息。我希望你能帮忙。

提前致谢!

【问题讨论】:

  • 我忘了提到我使用了清单类中的 getValue() 方法。此方法有两个可能的参数输入:getValue(Name name) 和 getValue(String name)。然而,它显然使用 getValue(Name name) 方法而不是 getValue(String name)。

标签: java intellij-idea tomcat7 war tomcat8


【解决方案1】:

试试这个:

#{cic.manifest.mainAttributes.get('Build-Name')}

Attributes 对象上定义了两种getValue() 方法,一种采用String 参数,另一种采用Attributes.Name 参数。看起来 EL 实现对此感到困惑,因为它试图将您的字符串转换为 Attributes.Name 对象。

【讨论】:

  • 我尝试了您的建议,但不幸的是它没有奏效。错误消息消失了,但清单信息也消失了。
  • 您可以尝试在末尾添加.toString(),即#{cic.manifest.mainAttributes.get('Build-Name').toString()}吗?
  • #{cic.manifest.mainAttributes.get('Build-Name').toString()} 也不起作用。错误消息和清单信息仍然没有。
  • 好的,在我删除我的答案之前最后一次尝试。尝试使用美元而不是哈希:${cic.manifest.mainAttributes.get('Build-Name')}
  • 我知道我说的是最后一次尝试,但这里还有一个:#{cic.manifest.mainAttributes['Build-Name']}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
相关资源
最近更新 更多