首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSF2.2 @ViewScoped (Mojarra) Weld 2.2.3 @产生用于SelectItems抛出的映射java.lang.String不能转换为java.lang.Integer

JSF2.2 @ViewScoped (Mojarra) Weld 2.2.3 @产生用于SelectItems抛出的映射java.lang.String不能转换为java.lang.Integer
EN

Stack Overflow用户
提问于 2014-07-15 01:42:47
回答 2查看 672关注 0票数 1

我有两个基于生产者的方法,它们生成h:dataTable列中使用的映射。这是一个简单的页面:

代码语言:javascript
复制
<?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>

制片人看起来是这样的:

代码语言:javascript
复制
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方法。

该页产生以下异常:

代码语言:javascript
复制
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条目:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
<?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问题?),添加调试、编译和测试。谢谢你最近的关注。

EN

回答 2

Stack Overflow用户

发布于 2015-07-20 18:44:47

将选择项更改为:

代码语言:javascript
复制
<f:selectItems value="#{testMapOne.entrySet()}" var="entry"  itemValue="#{entry.value}" itemLabel="#{entry.value}" />

而且它应该能工作。

票数 0
EN

Stack Overflow用户

发布于 2018-04-18 09:05:49

我今天也遇到了一个类似的问题,需要很长时间才能进行调试。在我的例子中,我有一个有几个@Produces @Named("someName") @ViewScoped生产者的bean,它们都返回ArrayLists。经过几个小时的调试,我终于找到了罪魁祸首。jsf包含具有以下方法的ViewScopeContextManager.java

代码语言:javascript
复制
/**
 * 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 报告了臭虫

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24748673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档