2014-07-15 12 views
1

아홉 열에 사용 된지도를 생성하는 두 개의 제작자 기반 메소드가 있습니다. dataTable.JSF 2.2 @ViewScoped (Mojarra) Weld 2.2.3 SelectItems의 @Produces지도 java.lang.String을 java.lang.Integer로 캐스팅 할 수 없음

<?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> 

생산자는 다음과 같습니다 : 객체 expertisesub의 목록입니다 목록 expertisesubs 이상

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의 반복을이 간단한 페이지입니다. 이 객체에는 표준 setter/getter 메서드가있는 간단한 필드 private 필드 Integer tempValue가 있습니다. 페이지 참조 둘지도 생성 방법 선언 @ViewScoped를 사용하는 경우

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) 

예외 만 발생

해당 페이지는 다음의 예외를 생성한다. 범위를 @SessionScoped로 변경하거나 페이지의 하나 또는 다른지도에 대한 참조를 제거하면 페이지가 작동합니다 (예외 없음).

페이지는 실제 솔루션이 아니지만 동일한 오류가 발생할 수있는 최소 페이지가 찢어졌습니다.

내 환경은 다음과 같습니다

JSF 2.2 (인 Mojarra) CDI (용접 2.2.3) 톰캣 7 자바 7

내가 구성한 (최신 빌드는 ... 이전도 시도) 내

빈 beans.xml 환경

web.xml의 항목 :

을 다음과 같이 환경은 JSF 2.2 배 @ViewScoped을 지원하는 META-INF에
<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> 

의 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> 

: 이것은 모든 JSF 2. 용접 1.x 버전에서 완벽하게 작동 맞춤 @ViewScoped.

업데이트가 :이 CDI 톰캣 7 그래서 나는 글래스 피쉬 넷이 시도 배선 최대에 문제가되었을 수 있습니다 생각 (내가 context.xml에, web.xml에 리스너/자원, 용접 서블릿을 제거하고 jsf lib이므로 기본 GlassFish 구현에 따라 달라집니다). 동일한 스택에 동일한 문제가 GlassFish에서 발생합니다.

업데이트 2010 년 7 월 : 최근 게시물의 활동으로 인해 문제의 "해결 방법"에 대한 정보가 추가되었습니다.

기본적으로 페이지에서 제작자에 대한 직접적인 참조를 삭제했습니다. 그 대신, 나는 그 페이지 뒤의 빈에 직접지도를 주입했다. @PostConstruct 코드를 추가하여지도를 반복하고 SelectItem 객체를 만들고 적절한 목록에 배치합니다. 그런 다음 해당 필드 (SelectItem 목록)를 페이지에서 참조했습니다. 좋지는 않지만 프로듀서의 목적을 이기지 만, 결국이 작업을 진행해야했고 소스를 다운로드 (CDI 문제 - 특정 문제를 해결할 수있는 JSF 문제) 할 시간이 없었습니다. 디버그, 컴파일 및 테스트를 추가하십시오. 최근 관심을 가져 주셔서 감사합니다.

+0

그래서 outputText를 제거하면 selectOneMenu가 작동합니까? –

+0

생산자를 SessionScoped로 변경하면 모든 것이 작동합니다. ViewScoped를 떠나서 outputText를 제거하면 selectOneMenu가 작동하거나 selectOneMenu를 제거하면 outputText가 작동합니다. 그러나 페이지에서 둘 다 사용하면 나열된 예외가 발생합니다. – Gary

+0

''를 사용하여 특정 문제를 해결해야하지만 세션 범위로 전환 할 때 왜 제대로 작동하는지 설명 할 수 없습니다. – BalusC

답변

0
이 당신의 선택 항목을 변경

:

<f:selectItems value="#{testMapOne.entrySet()}" var="entry" itemValue="#{entry.value}" itemLabel="#{entry.value}" /> 

그리고 그것은 작동합니다.

+2

개선 된 답변 일 수도 있지만 현재 상태의 품질 응답 기준에 맞지 않습니다. 읽으십시오 : http://stackoverflow.com/help/how-to-answer –

+0

전체 질문을 읽어주십시오. JSF 2.0, Weld 1.x에서 완벽하게 작동했습니다 (CDI는 javax.faces.view.ViewScoped에서만 작동합니다). – Gary

+0

내 나쁜 대답 죄송합니다 @ DanBeaulieu, 난 정말 코멘트에 물어 보려고했는데, 나는 충분한 명성이 없어 (그리고 나는이 anwser가 도움이 될 것 같지 않아 ... 롤). –