有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从war文件中读取清单文件会在tomcat 7中产生错误

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

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)

我的el代码在*。xhtml文件:

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

我的java bean代码(我想,我是在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规范的差异,但我没有发现与规范和我的问题有关的任何东西。我希望你能帮忙

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    试试看:

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

    ^{}对象上定义了两个getValue()方法,一个采用String参数,另一个采用Attributes.Name参数。当EL实现试图将字符串强制转换为Attributes.Name对象时,它似乎被这一点弄糊涂了