Hi,
I have created a "hello world" flamingo demo succesfully, now i'm trying to do something similar to http://java.dzone.com/articles/java-fx-and-seam-flamingo-part
but with the newest version of flamingo. So I'm also using tips from http://mkblog.exadel.com/2010/07/binding-to-server-side-context-variable... but now it looks like im stuck.
What i have done:
1. Created a new seam-app and added a component named "userManager" with methods add, remove and factory method create that populates outjected userList
package pl.atena.seamapp.session;
import java.util.ArrayList;
import java.util.List;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.log.Log;
import pl.atena.seamapp.model.User;
@Scope(ScopeType.SESSION)
@Name("userManager")
public class UserManager {
@In(required = false)
@Out(scope = ScopeType.SESSION, required = true)
private List userList;
@Logger
private Log log;
@Factory("userList")
public void create() {
userList = new ArrayList();
User user1 = new User("John");
User user2 = new User("Charley");
User user3 = new User("Sergey");
userList.add(user1);
userList.add(user2);
userList.add(user3);
}
public void remove(int index) {
User userToDelete = userList.get(index);
log.info("Deleting user: " + userToDelete.getName());
userList.remove(userToDelete);
log.info("all users: " + userList);
}
public void addUser(String name) {
User user = new User(name);
userList.add(user);
log.info("addUser(String) Added new user: " + user.getName());
log.info("all users: " + userList);
}
}
2. Created the binding manager interface
public interface BindingManager {
public String commit(String componentName, Object value);
public Object getObject(String name);
}
3. I have created a UserClient java class that helps FX script to comunicate with seam component
package pl.atena.seamapp.model;
import java.util.List;
import pl.atena.seamapp.api.BindingManager;
import com.exadel.flamingo.javafx.FXServiceFactory;
public class UserClient {
private static BindingManager _bindingManager;
private UserClient(String url) {
}
public static void addUser(String s) {
List list = getUsersFromServer();
list.add(new User(s));
commitUsersToServer(list);
}
public static void remove(int index) {
List list = getUsersFromServer();
list.remove(index);
commitUsersToServer(list);
}
public static User[] getUsers() {
List list = getUsersFromServer();
User[] temp = new User[list.size()];
User[] users = list.toArray(temp);
return users;
}
@SuppressWarnings("unchecked")
private static List getUsersFromServer() {
List list = (List) getBindingManager().getObject("userList");
return list;
}
private static void commitUsersToServer(List users){
getBindingManager().commit("userList", users);
}
private static BindingManager getBindingManager() {
if (_bindingManager == null) {
_bindingManager = (BindingManager) FXServiceFactory.getService(BindingManager.class,
"com.exadel.flamingo.service.binding.bindingManager");
}
return _bindingManager;
}
}
4. Created a FX script that should show the users from userManager component
/*
*UserManager.fx
*
*Created on sie 13, 2010, 14:03:58 PM
*/
package pl.atena.seamapp.fx;
import com.exadel.flamingo.javafx.FXServiceFactory;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextBox;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import pl.atena.seamapp.model.User;
import pl.atena.seamapp.model.UserClient;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.CookiePolicy;
CookieHandler.setDefault(new CookieManager(null,CookiePolicy.ACCEPT_ALL));
FXServiceFactory.URL = "http://localhost:8080/SeamApp/flamingo/hessian/";
var users: User[] = UserClient.getUsers();
function add () : Void {
var newUser:User = new User (inputText.text);
UserClient.addUser(inputText.text);
insert {newUser} into users;
}
function remove (idx : Integer) : Void {
UserClient.remove(idx);
delete users[idx];
}
var inputText : TextBox = TextBox {
columns: 20
}
var buttonAdd : Button = Button {
text: "Add"
style: "base: blue"
action: function () {add()}
}
var buttonClear : Button = Button {
text: "Clear"
style: "base: blue"
action: function () {inputText.text = "";}
}
Stage {
title: 'JavaFX and Seam'
scene: Scene {
width: 500
height: 300
content: [
VBox {
translateX: 5
translateY: 5
content: [
VBox {
spacing: 8
content: [
HBox {
content: [inputText]
}
HBox {
spacing: 8
content: [buttonAdd, buttonClear]
}
]
},
VBox {
translateX: 10
translateY: 20
spacing: 5
content: bind for (p in users) {
HBox {
spacing: 8
content:[
Text {
font: Font { size: 16 }
content: (p.getName() )
}
Button {
height: 16
style: "base: blue"
text: 'Delete'
action:function () {remove(indexof p)}}
]
}
}
}
]
}
]
}
}
But when i try to run it i get an error at the server side
07:41:14,346 ALL [ContextSerializerFactory] java.lang.ClassNotFoundException: pl.atena.seamapp.model.UserHessianSerializer from BaseClassLoader@683a8d{VFSClassLoaderPolicy@dc2b4c{name=vfsfile:/D:/work/sandbox/.metadata/.plugins/org.jboss.ide.eclipse.as.core/JBoss_5.1_Runtime_Server1281610679618/deploy/SeamApp.war/ (huge list of dirs with libs) ] NON_EMPTY}}
at org.jboss.classloader.spi.base.BaseClassLoader.loadClass(BaseClassLoader.java:448)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:242)
at com.caucho.hessian.io.ContextSerializerFactory.getCustomSerializer(ContextSerializerFactory.java:191)
at com.caucho.hessian.io.SerializerFactory.loadSerializer(SerializerFactory.java:267)
at com.caucho.hessian.io.SerializerFactory.getSerializer(SerializerFactory.java:225)
at com.caucho.hessian.io.SerializerFactory.loadSerializer(SerializerFactory.java:247)
at com.caucho.hessian.io.SerializerFactory.getSerializer(SerializerFactory.java:225)
at com.caucho.hessian.io.SerializerFactory.getObjectSerializer(SerializerFactory.java:198)
at com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:418)
at com.caucho.hessian.io.CollectionSerializer.writeObject(CollectionSerializer.java:102)
at com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:421)
at com.exadel.flamingo.service.seam.HessianToSeamRequestProcessor.process(HessianToSeamRequestProcessor.java:152)
at com.exadel.flamingo.service.seam.HessianToSeamServlet.service(HessianToSeamServlet.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:368)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:495)
at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:73)
at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:595)
The script does run, but instead of list with 3 names with buttons (like here http://java.dzone.com/sites/all/files/0screen1.png ) i get something like this http://img826.imageshack.us/img826/4307/fxproblem.jpg
I did not create any pl.atena.seamapp.model.UserHessianSerializer and did not reference to it in any file, so where this comes from? My user class implements java.io.Serializable... What I'm missing? Do i have to write custom serializer for all classes that i want to use in the app?

I used this to load the
I used this to load the object from the server:
@SuppressWarnings("unchecked")
public static IceCream[] getIceCreamList() {
List list = (List) getBindingManager()
.getObject("iceCreamList");
IceCream[] temp = new IceCream[list.size()];
IceCream[] icecream = list.toArray(temp);
return icecream;
}