我有两个基于生产者的方法,它们生成h:dataTable列中使用的映射。这是一个简单的页面:
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<f:view contentType="text/html">
<h:body>
<h:form id="mainForm">
<h:dataTable value="#{adminManager.expertisesubs}"
var="_expertisesub">
<h:column>
<h:outputText value="#{testMapTwo[_expertisesub.tempValue]}" />
<br />
<h:selectOneMenu value="#{_expertisesub.tempValue}">
<f:selectItems value="#{testMapOne}" />
</h:selectOneMenu>
</h:column>
</h:dataTable>
</h:form>
</h:body>
</f:view>
</html>制片人看起来是这样的:
public class ExpertisemainProducerHelper implements Serializable {
private static final long serialVersionUID = -8387208055146539725L;
@Produces
@ViewScoped
@Named("testMapOne")
public Map<String, Integer> produceTestMapOne() {
Map<String, Integer> theMap = new TreeMap<String, Integer>();
theMap.put("FOUR", 4);
theMap.put("FIVE", 5);
theMap.put("SIX", 6);
return theMap;
}
@Produces
@ViewScoped
@Named("testMapTwo")
public Map<Integer, String> produceTestMapTwo() {
Map<Integer, String> theMap = new TreeMap<Integer, String>();
theMap.put(4, "FOUR-2");
theMap.put(5, "FIVE-2");
theMap.put(6, "SIX-2");
return theMap;
}
}dataTable迭代列表expertisesubs,这是一个对象expertisesub的列表。该对象具有简单的字段私有字段Integer tempValue和标准的setter/getter方法。
该页产生以下异常:
SEVERE: Error Rendering View[/faces/layouts/admin.xhtml]
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at java.lang.Integer.compareTo(Unknown Source)
at java.util.TreeMap.getEntry(Unknown Source)
at java.util.TreeMap.get(Unknown Source)
at javax.el.MapELResolver.getValue(MapELResolver.java:52)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
at org.apache.el.parser.AstValue.getValue(AstValue.java:183)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
at javax.faces.component.UIOutput.getValue(UIOutput.java:174)
at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:355)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:164)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312)
at com.sun.faces.renderkit.html_basic.TableRenderer.renderRow(TableRenderer.java:386)
at com.sun.faces.renderkit.html_basic.TableRenderer.encodeChildren(TableRenderer.java:163)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1857)
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:1857)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1860)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1860)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:461)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:133)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
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.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
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:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)只有当页面引用两个在方法声明中使用@ViewScoped生成的映射时,才会发生异常。如果我将作用域更改为@SessionScoped或移除对页面上的一个或另一个映射的引用,该页面就会工作(没有例外)。
这个页面不是真正的解决方案,而是一个被撕毁的最小页面,它会产生同样的错误。
我的环境是:
JSF2.2 (Mojarra) CDI (焊接2.2.3) Tomcat 7 Java 7(也是最近的build...tried )
我已经将我的环境配置为支持JSF2.2x @ViewScoped,如下所示:
空beans.xml
web.xml条目:
<listener>
<listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>
<resource-env-ref>
<resource-env-ref-name>BeanManager</resource-env-ref-name>
<resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type>
</resource-env-ref>META中的context.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Manager pathname="" />
<Resource name="BeanManager"
auth="Container"
type="javax.enterprise.inject.spi.BeanManager"
factory="org.jboss.weld.resources.ManagerObjectFactory" />
</Context>注意事项:所有这些都在JSF2.焊缝1.x中工作得很好。定制@ViewScoped。
Update:我认为这可能是将CDI连接到Tomcat 7的一个问题,所以我在GlassFish 4中尝试了这一点(我删除了context.xml、web.xml侦听器/资源、焊缝-servlet和jsf,因此所有这些都依赖于默认的GlassFish实现)。GlassFish中也会出现相同堆栈的相同问题。
更新2015年7月:由于最近在帖子上的活动,我正在添加关于我如何“解决”这个问题的信息。
基本上,我从页面中删除了对制片人的直接引用。相反,我将(CDI)映射直接注入页面后面的bean。我添加了一些@PostConstruct代码来迭代映射和构建SelectItem对象,并将这些对象放到适当的列表中。然后,我在页面上引用了这些字段(SelectItem列表)。不是很好,违背了制作人的目的,但最终我不得不向前推进,没有时间下载资源(CDI问题?)JSF问题?),添加调试、编译和测试。谢谢你最近的关注。
发布于 2015-07-20 18:44:47
将选择项更改为:
<f:selectItems value="#{testMapOne.entrySet()}" var="entry" itemValue="#{entry.value}" itemLabel="#{entry.value}" />而且它应该能工作。
发布于 2018-04-18 09:05:49
我今天也遇到了一个类似的问题,需要很长时间才能进行调试。在我的例子中,我有一个有几个@Produces @Named("someName") @ViewScoped生产者的bean,它们都返回ArrayLists。经过几个小时的调试,我终于找到了罪魁祸首。jsf包含具有以下方法的ViewScopeContextManager.java:
/**
* Get the name of the bean for the given object.
*
* @param instance the object.
* @return the name.
*/
private String getName(Object instance) {
String name = instance.getClass().getSimpleName().substring(0, 1).toLowerCase()
+ instance.getClass().getSimpleName().substring(1);
Named named = instance.getClass().getAnnotation(Named.class);
if (named != null && named.value() != null && !named.value().trim().equals("")) {
name = named.value();
}
return name;
}每当将instance放入ViewScope中以查找它的名称时,都会调用它。在我的例子中,它返回'arrayList',因为它只查找类上的@Named-annotation (ArrayList),显然没有这样的注释。JSF2.2的最新版本仍然包含这段代码,现在我将查看是否2.3修复了它,如果没有,可能会处理一个修复程序。
编辑:代码仍然在最新的2.3,i 报告了臭虫。
https://stackoverflow.com/questions/24748673
复制相似问题