Über eine xhtml-Seite werden Werte aus einer CDI Bean in einer (zunächst nur lesbaren) Tabelle angezeigt. Die Werte kommen aus einer Datenbank. Sie sollen nur _einmalig_ in eine List ausgelesen werden. Der User kann dann vor jeder Zeile ein Häkchen setzen, wenn die Zeile editierbar werden soll. Nach den vorgenommenen Änderungen sollen die Werte wieder in die DB gespeichert werden.
1. Zunächst habe ich versucht, die List zunächst über den Konstruktor einmalig zu laden.
Wenn ich Tomcat starte, schlägt jedoch die Initialisierung fehl, weil der userService null ist (Exception siehe unten). Dieser wird über Spring injected und greift via einem DAO auf die DB zu.
2. Zweiter Versuch war, einen leeren Konstruktor zu verwenden und die Liste mit einem preRenderView-Event zu initialisieren:
Dann aber wird jedesmal, wenn der Anwender den Haken zum Editieren setzt, die Liste wegen des preRenderView-Events die userList neu initialisiert, was vorhergehende Änderungen überschreibt (der Haken schickt ein onclick="submit()").
Als Alternative habe ich es mit Ajax-Requests versucht. Aber auch hier wird jedes mal der preRenderView-Event ausgeführt, und damit die Liste userList neu erzeugt.
Was wäre eine mögliche Lösung? Soll ich mehr Code posten?
Grüße,
Raphalon
1. Zunächst habe ich versucht, die List zunächst über den Konstruktor einmalig zu laden.
Code:
@Inject
private UserService userService; // über Spring injected, greift via DAO auf DB zu
private List<User> userList;
private List<Rowcontent> entryList; // wird dem Anwender angezeigt
public UserEditAllBean() {
setEntryList(); // einmalige Initialisierung über Konstruktor
}
public void setEntryList() {
entryList = new ArrayList<Rowcontent>();
userList = userService.findAll(); // hol die User-Daten aus der DB
Iterator<User> iterator = userList.iterator();
while (iterator.hasNext()) {
entryList.add(new Rowcontent((User)iterator.next())); // erstelle eine Liste (Rowcontent enthält zusätzliche Eigenschaften zu "User")
}
}
2. Zweiter Versuch war, einen leeren Konstruktor zu verwenden und die Liste mit einem preRenderView-Event zu initialisieren:
Code:
@Inject
private UserService userService;
private List<User> userList;
private List<Rowcontent> entryList;
public UserEditAllBean() {}
public void setEntryList(ComponentSystemEvent event) {
entryList = new ArrayList<Rowcontent>();
userList = userService.findAll();
Iterator<User> iterator = userList.iterator();
while (iterator.hasNext()) {
entryList.add(new Rowcontent((User)iterator.next()));
}
}
Als Alternative habe ich es mit Ajax-Requests versucht. Aber auch hier wird jedes mal der preRenderView-Event ausgeführt, und damit die Liste userList neu erzeugt.
Was wäre eine mögliche Lösung? Soll ich mehr Code posten?
Grüße,
Raphalon
Code:
[01.02.2012 10:50:01] ERROR ContextLoader - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userEditAll' defined in file [C:\Programme\xampp\xampp\tomcat\webapps\jatpresent\WEB-INF\classes\de\tvu\gui\page\UserEditAllBean.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [de.tvu.gui.page.UserEditAllBean]: Constructor threw exception; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:955)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:901)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:563)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:872)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:423)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4723)
at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5226)
at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5221)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [de.tvu.gui.page.UserEditAllBean]: Constructor threw exception; nested exception is java.lang.NullPointerException
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:141)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:72)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:948)
... 21 more
Caused by: java.lang.NullPointerException
at de.tvu.gui.page.UserEditAllBean.setEntryList(UserEditAllBean.java:37)
at de.tvu.gui.page.UserEditAllBean.<init>(UserEditAllBean.java:30)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126)
... 23 more