Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

jsf - problem z bindowaniem

2 views
Skip to first unread message

Adam

unread,
Apr 29, 2007, 6:36:23 AM4/29/07
to
Witam

Próbuję zrobić w jsf tak aby bindować wartości listy rozwijalnej do
obiektów a nie do prymitywów. W tym celu napisałem taki kod:

JSP:
<%@ page language="java" contentType="text/html; utf-8"
pageEncoding="utf-8"%>

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://myfaces.apache.org/tomahawk" prefix="t"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<f:view>

<h:form >
<center><h:messages globalOnly="true" /></center>
<h:panelGrid columns="3" cellpadding="0" cellspacing="0" align="center" >
<h:selectOneMenu binding="#{test.airplanes}" >
<f:selectItems binding="#{test.items}"/>
</h:selectOneMenu>

<h:commandButton value="OK" action="#{test.test}" />
</h:panelGrid>
</h:form>
</f:view>

</body>
</html>

ManagedBean:
public class TestBean extends BaseBean {

private static final long serialVersionUID = 8498231142396797625L;
private Logger log = Logger.getLogger(TestBean.class);
private Airplane airplane;
private AirplaneDao airplaneDao;
private UISelectOne airplanes;
private UISelectItems items;
private Converter converter = new AirplaneConverter();


public TestBean() {
try{
Context ctx = new InitialContext();
airplaneDao = (AirplaneDao)ctx.lookup("mgr/AirplaneDaoBean/local");
List<Airplane> airplaneList = airplaneDao.getAll();
items = new UISelectItems();
List<SelectItem> list = new ArrayList<SelectItem>();
for (Airplane airp : airplaneList) {
list.add(new SelectItem(airp.getId(),airp.getDescription()));
}
items.setValue(list);
//items.setValue(airplaneList);
airplanes = new UISelectOne();
airplanes.setConverter(converter);
}catch (Exception e) {
log.error("",e);
}
}

public String test() {
log.debug("airplane: "+airplane);
return null;
}

public Airplane getAirplane() {
return airplane;
}

public void setAirplane(Airplane airplane) {
this.airplane = airplane;
}

public UISelectOne getAirplanes() {
return airplanes;
}

public void setAirplanes(UISelectOne airplanes) {
this.airplanes = airplanes;
}

public UISelectItems getItems() {
return items;
}

public void setItems(UISelectItems items) {
this.items = items;
}

private class AirplaneConverter implements Converter {

public AirplaneConverter() {
log.debug("AirplaneConverter");
}

@Override
public Object getAsObject(FacesContext context,
UIComponent component, String value)
throws ConverterException {
log.debug("component: "+component+" ,value: "+value);
int id = Integer.parseInt(value);
return airplaneDao.getAirplane(id);
}

@Override
public String getAsString(FacesContext context,
UIComponent component, Object value)
throws ConverterException {
log.debug("component: "+component+" value: "+value);
if (value!=null) {
int id = (Integer)value;
Airplane airpl = airplaneDao.getAirplane(id);
return airpl.getId()+"";
}
return null;
}
}
}

w xml:
<managed-bean>
<managed-bean-name>test</managed-bean-name>

<managed-bean-class>master.airport.web.managed.beans.TestBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>

Po odpaleniu stronki jest ok. Jednak po kliknięciu w submit dostaję wyjątek:
2007-04-29 12:32:17,062 ERROR Log4JLogger.error - Exception in
PhaseListener RESTORE_VIEW(1) afterPhase
java.lang.NullPointerException
at
org.apache.myfaces.renderkit.html.util.AutoScrollPhaseListener.afterPhase(AutoScrollPhaseListener.java:52)
at
org.apache.myfaces.lifecycle.PhaseListenerManager.informPhaseListenersAfter(PhaseListenerManager.java:92)
at
org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:99)
at
org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:139)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at
org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at
master.airport.web.filter.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:29)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at
org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
at
org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at
org.jboss.web.tomcat.tc5.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:6
64)
at
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at
org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
at java.lang.Thread.run(Thread.java:619)
2007-04-29 12:32:17,078 ERROR Log4JLogger.error - Servlet.service() for
servlet Faces Servlet threw exception
java.lang.RuntimeException: Could not restore StateHolder of type
master.airport.web.managed.beans.TestBean$AirplaneConver
ter (missing no-args constructor?)
at
javax.faces.component.UIComponentBase.restoreAttachedState(UIComponentBase.java:897)
at javax.faces.component.UIOutput.restoreState(UIOutput.java:97)
at javax.faces.component.UIInput.restoreState(UIInput.java:490)
at
javax.faces.component.UIComponentBase.processRestoreState(UIComponentBase.java:731)
at
javax.faces.component.UIComponentBase.processRestoreState(UIComponentBase.java:722)
at
javax.faces.component.UIComponentBase.processRestoreState(UIComponentBase.java:722)
at
javax.faces.component.UIComponentBase.processRestoreState(UIComponentBase.java:722)
at
org.apache.myfaces.application.jsp.JspStateManagerImpl.restoreComponentState(JspStateManagerImpl.java:200)
at
org.apache.myfaces.application.jsp.JspStateManagerImpl.restoreView(JspStateManagerImpl.java:270)
at
org.apache.myfaces.application.jsp.JspViewHandlerImpl.restoreView(JspViewHandlerImpl.java:231)
at
org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:81)
at
org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:95)
at
org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:139)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at
org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at
master.airport.web.filter.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:29)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at
org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
at
org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at
org.jboss.web.tomcat.tc5.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:6
64)
at
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at
org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.InstantiationException:
master.airport.web.managed.beans.TestBean$AirplaneConverter
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
at
javax.faces.component.UIComponentBase.restoreAttachedState(UIComponentBase.java:893)
... 38 more

Czy ktokolwiek wie dlaczego tak się dzieje i gdzie popełniłem błąd?

Pozdrawiam
Adam

Maciej Bodus

unread,
Apr 29, 2007, 1:36:09 PM4/29/07
to
Adam napisał(a):

> Próbuję zrobić w jsf tak aby bindować wartości listy rozwijalnej do
> obiektów a nie do prymitywów. W tym celu napisałem taki kod:
(...)

**1


> public TestBean() {
> try{
> Context ctx = new InitialContext();
> airplaneDao = (AirplaneDao)ctx.lookup("mgr/AirplaneDaoBean/local");
> List<Airplane> airplaneList = airplaneDao.getAll();
> items = new UISelectItems();
> List<SelectItem> list = new ArrayList<SelectItem>();
> for (Airplane airp : airplaneList) {
> list.add(new SelectItem(airp.getId(),airp.getDescription()));
> }
> items.setValue(list);
> //items.setValue(airplaneList);
> airplanes = new UISelectOne();
> airplanes.setConverter(converter);
> }catch (Exception e) {
> log.error("",e);
> }
> }

(...)
**2


> at java.lang.Thread.run(Thread.java:619)
> Caused by: java.lang.InstantiationException:
> master.airport.web.managed.beans.TestBean$AirplaneConverter
> at java.lang.Class.newInstance0(Class.java:340)
> at java.lang.Class.newInstance(Class.java:308)
> at
> javax.faces.component.UIComponentBase.restoreAttachedState(UIComponentBase.java:893)
>
> ... 38 more
>
> Czy ktokolwiek wie dlaczego tak się dzieje i gdzie popełniłem błąd?

na 100% nie jestem pewien ale wygląda mi na to, że złym pomysłem jest
tworzenie nowego InitialContextu. Z tego co mi się wydaje, po prostu tu
coś zawodzi przy ponownym wyszukiwaniu. Spróbuj stworzyć sobie jakiegoś
MB który będzie trzymał w sesji initialcontext, a dane do selectOneMenu
pobieraj raczej w getterach niż w konstruktorze. może warto iść tym
tropem. Napisz proszę jak Ci się uda rozwiązać problem

pozdrawiam
maciej

Adam

unread,
Apr 29, 2007, 3:17:25 PM4/29/07
to
Maciej Bodus napisał(a):

w innych beanach mam podobnie - context w konstruktorze i jest ok.

Pozdrawiam
Adam

smerf

unread,
Apr 29, 2007, 3:36:04 PM4/29/07
to
On Apr 29, 12:36 pm, Adam <adam...@gazeta.pl> wrote:
> 2007-04-29 12:32:17,078 ERROR Log4JLogger.error - Servlet.service() for
> servlet Faces Servlet threw exception
> java.lang.RuntimeException: Could not restore StateHolder of type
> master.airport.web.managed.beans.TestBean$AirplaneConver
> ter (missing no-args constructor?)

a nie upatrywales bledu tez w tym?

Adam

unread,
Apr 29, 2007, 4:10:47 PM4/29/07
to
smerf napisał(a):
Dodałem konstruktor do mojego convertera i było to samo

Adam

grzyb...@gmail.com

unread,
May 1, 2007, 10:54:02 AM5/1/07
to
On Apr 29, 10:10 pm, Adam <adam...@gazeta.pl> wrote:

> smerf napisa³(a):> On Apr 29, 12:36 pm, Adam <adam...@gazeta.pl> wrote:
> >> 2007-04-29 12:32:17,078 ERROR Log4JLogger.error - Servlet.service() for
> >> servlet Faces Servlet threw exception
> >> java.lang.RuntimeException: Could not restore StateHolder of type
> >> master.airport.web.managed.beans.TestBean$AirplaneConver
> >> ter (missing no-args constructor?)
>
> > a nie upatrywales bledu tez w tym?
>
> Doda³em konstruktor do mojego convertera i by³o to samo
>
> Adam


Nie wiem jak działa odczyt stanu dla konwertera, ale moze (skoro
twierdzi ze nie ma konstruktora bez argumentowego) sprobuj upublicznic
converter, taki moze naiwny pomysl.
Daj znac dlaczego wystepowal ten blad.
Dzieki

0 new messages