Vaadin-CDI not Serializable

Hi,

I am developing a vaadin webapplication on JBoss AS 7 / Wildfly 8. A requirement is to guarantee high availability, so I tried to use a Wildfly-Cluster (after I failed with JBoss AS 7). After some minor stepbacks I could successfully deploy a test app with working session replication. The problem is as soon as I try to use the vaadin-cdi addon(with @CDIUI) the node gives me an exception that the class vaadin.cdi.internal.UIBean is not serializable. I then tried to build the addon from source and add Serializable to the class, but just to find the same exception for the class org.jboss.weld.bean.ManagedBean . Does anyone know a solution or workaround for this problem since other parts of the application rely on CDI.

my TestUI

@Theme("learn_vaadin")
@CDIUI("vaadin")
// @PreserveOnRefresh
public class Learn_vaadinUI extends UI {

    private String               value;

    private VerticalLayout       statusHolder        = new VerticalLayout();

    private TextField            textField            = new TextField();

    @Override
    protected void init(VaadinRequest request) {
        HorizontalLayout layout = new HorizontalLayout();
        layout.addComponent(statusHolder);
        layout.addComponent(textField);
        layout.addComponent(new Button("Set new values", new Button.ClickListener() {

            @Override
            public void buttonClick(ClickEvent event) {
                String value = textField.getValue();

                saveValue(Learn_vaadinUI.this, value);
            }
        }));
        layout.addComponent(new Button("Reload page", new Button.ClickListener() {

            @Override
            public void buttonClick(ClickEvent event) {
                getPage().setLocation(getPage().getLocation());
            }
        }));

        showValue(this);
        setContent(layout);
    }

    private static void saveValue(Learn_vaadinUI ui,
            String value) {
        // Save to UI instance
        ui.value = value;
        // Save to VaadinServiceSession
        ui.getSession().setAttribute("myValue", value);
        // Save to HttpSession
        VaadinService.getCurrentRequest().getWrappedSession()
                .setAttribute("myValue", value);

        // Show new values
        showValue(ui);
    }

    private static void showValue(Learn_vaadinUI ui) {
        ui.statusHolder.removeAllComponents();
        ui.statusHolder.addComponent(new Label("UILD: " + ui.getUIId()));
        ui.statusHolder.addComponent(new Label("SessionID: " + ui.getSession().getSession().getId()));
        ui.statusHolder.addComponent(new Label("Value in UI: " + ui.value));
        ui.statusHolder.addComponent(new Label(
                "Value in VaadinServiceSession: "
                        + ui.getSession().getAttribute("myValue")));
        ui.statusHolder.addComponent(new Label("Value in HttpSession: "
                + VaadinService.getCurrentRequest().getWrappedSession()
                        .getAttribute("myValue")));
    }
}

Stacktrace:

2014-06-19 09:15:15,498 ERROR [org.infinispan.transaction.TransactionCoordinator]
 (default task-52) ISPN000097: Error while processing a prepare in a single-phase transaction: org.infinispan.commons.CacheException: java.lang.RuntimeException: Failure to marshal argument(s)
    at org.infinispan.commons.util.Util.rewrapAsCacheException(Util.java:581)
    at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.invokeRemoteCommand(CommandAwareRpcDispatcher.java:176)
    at org.infinispan.remoting.transport.jgroups.JGroupsTransport.invokeRemotely(JGroupsTransport.java:521)
    at org.infinispan.remoting.rpc.RpcManagerImpl.invokeRemotely(RpcManagerImpl.java:281)
    at org.infinispan.interceptors.distribution.TxDistributionInterceptor.prepareOnAffectedNodes(TxDistributionInterceptor.java:219)
    at org.infinispan.interceptors.distribution.TxDistributionInterceptor.visitPrepareCommand(TxDistributionInterceptor.java:203)
    at org.infinispan.commands.tx.PrepareCommand.acceptVisitor(PrepareCommand.java:124)
    at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:98)
    at org.infinispan.interceptors.base.CommandInterceptor.handleDefault(CommandInterceptor.java:112)
    at org.infinispan.commands.AbstractVisitor.visitPrepareCommand(AbstractVisitor.java:96)
    at org.infinispan.commands.tx.PrepareCommand.acceptVisitor(PrepareCommand.java:124)
    at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:98)
    at org.infinispan.interceptors.base.CommandInterceptor.handleDefault(CommandInterceptor.java:112)
    at org.infinispan.commands.AbstractVisitor.visitPrepareCommand(AbstractVisitor.java:96)
    at org.infinispan.commands.tx.PrepareCommand.acceptVisitor(PrepareCommand.java:124)
    at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:98)
    at org.infinispan.interceptors.EntryWrappingInterceptor.visitPrepareCommand(EntryWrappingInterceptor.java:96)
    at org.infinispan.commands.tx.PrepareCommand.acceptVisitor(PrepareCommand.java:124)
    at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:98)
    at org.infinispan.interceptors.locking.AbstractTxLockingInterceptor.invokeNextAndCommitIf1Pc(AbstractTxLockingInterceptor.java:78)
    at org.infinispan.interceptors.locking.PessimisticLockingInterceptor.visitPrepareCommand(PessimisticLockingInterceptor.java:83)
    at org.infinispan.commands.tx.PrepareCommand.acceptVisitor(PrepareCommand.java:124)
    at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:98)
    at org.infinispan.interceptors.NotificationInterceptor.visitPrepareCommand(NotificationInterceptor.java:36)
    at org.infinispan.commands.tx.PrepareCommand.acceptVisitor(PrepareCommand.java:124)
    at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:98)
    at org.infinispan.interceptors.TxInterceptor.invokeNextInterceptorAndVerifyTransaction(TxInterceptor.java:114)
    at org.infinispan.interceptors.TxInterceptor.visitPrepareCommand(TxInterceptor.java:101)
    at org.infinispan.commands.tx.PrepareCommand.acceptVisitor(PrepareCommand.java:124)
    at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:98)
    at org.infinispan.interceptors.base.CommandInterceptor.handleDefault(CommandInterceptor.java:112)
    at org.infinispan.commands.AbstractVisitor.visitPrepareCommand(AbstractVisitor.java:96)
    at org.infinispan.statetransfer.TransactionSynchronizerInterceptor.visitPrepareCommand(TransactionSynchronizerInterceptor.java:42)
    at org.infinispan.commands.tx.PrepareCommand.acceptVisitor(PrepareCommand.java:124)
    at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:98)
    at org.infinispan.statetransfer.StateTransferInterceptor.handleTopologyAffectedCommand(StateTransferInterceptor.java:263)
    at org.infinispan.statetransfer.StateTransferInterceptor.handleTxCommand(StateTransferInterceptor.java:194)
    at org.infinispan.statetransfer.StateTransferInterceptor.visitPrepareCommand(StateTransferInterceptor.java:94)
    at org.infinispan.commands.tx.PrepareCommand.acceptVisitor(PrepareCommand.java:124)
    at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:98)
    at org.infinispan.interceptors.base.CommandInterceptor.handleDefault(CommandInterceptor.java:112)
    at org.infinispan.commands.AbstractVisitor.visitPrepareCommand(AbstractVisitor.java:96)
    at org.infinispan.commands.tx.PrepareCommand.acceptVisitor(PrepareCommand.java:124)
    at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:98)
    at org.infinispan.interceptors.InvocationContextInterceptor.handleAll(InvocationContextInterceptor.java:110)
    at org.infinispan.interceptors.InvocationContextInterceptor.handleDefault(InvocationContextInterceptor.java:73)
    at org.infinispan.commands.AbstractVisitor.visitPrepareCommand(AbstractVisitor.java:96)
    at org.infinispan.commands.tx.PrepareCommand.acceptVisitor(PrepareCommand.java:124)
    at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:98)
    at org.infinispan.interceptors.BatchingInterceptor.handleDefault(BatchingInterceptor.java:66)
    at org.infinispan.commands.AbstractVisitor.visitPrepareCommand(AbstractVisitor.java:96)
    at org.infinispan.commands.tx.PrepareCommand.acceptVisitor(PrepareCommand.java:124)
    at org.infinispan.interceptors.InterceptorChain.invoke(InterceptorChain.java:333)
    at org.infinispan.transaction.TransactionCoordinator.commit(TransactionCoordinator.java:154)
    at org.infinispan.transaction.synchronization.SynchronizationAdapter.afterCompletion(SynchronizationAdapter.java:58)
    at org.infinispan.transaction.tm.DummyTransaction.notifyAfterCompletion(DummyTransaction.java:263)
    at org.infinispan.transaction.tm.DummyTransaction.runCommitTx(DummyTransaction.java:312)
    at org.infinispan.transaction.tm.DummyTransaction.commit(DummyTransaction.java:69)
    at org.infinispan.transaction.tm.DummyBaseTransactionManager.commit(DummyBaseTransactionManager.java:80)
    at org.infinispan.batch.BatchContainer.resolveTransaction(BatchContainer.java:101)
    at org.infinispan.batch.BatchContainer.endBatch(BatchContainer.java:83)
    at org.infinispan.batch.BatchContainer.endBatch(BatchContainer.java:64)
    at org.infinispan.CacheImpl.endBatch(CacheImpl.java:777)
    at org.infinispan.AbstractDelegatingCache.endBatch(AbstractDelegatingCache.java:53)
    at org.wildfly.clustering.web.infinispan.InfinispanBatcher$1.end(InfinispanBatcher.java:56)
    at org.wildfly.clustering.web.infinispan.InfinispanBatcher$1.close(InfinispanBatcher.java:46)
    at org.wildfly.clustering.web.undertow.session.DistributableSession.requestDone(DistributableSession.java:72)
    at io.undertow.servlet.spec.ServletContextImpl.updateSessionAccessTime(ServletContextImpl.java:719) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]

    at io.undertow.servlet.spec.HttpServletResponseImpl.responseDone(HttpServletResponseImpl.java:522) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]

    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:287) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]

    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:227) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]

    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:73) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]

    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:146) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]

    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:177) [undertow-core-1.0.15.Final.jar:1.0.15.Final]

    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:727) [undertow-core-1.0.15.Final.jar:1.0.15.Final]

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_55]

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_55]

    at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_55]

Caused by: java.lang.RuntimeException: Failure to marshal argument(s)
    at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.marshallCall(CommandAwareRpcDispatcher.java:333)
    at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.processSingleCall(CommandAwareRpcDispatcher.java:352)
    at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.invokeRemoteCommand(CommandAwareRpcDispatcher.java:167)
    ... 76 more
Caused by: org.infinispan.commons.marshall.NotSerializableException: com.vaadin.cdi.internal.UIBean
Caused by: an exception which occurred:
    in field instances
    in field beanStores
    in field instance
    in object java.util.HashMap@e3036516
    in object org.jboss.as.clustering.marshalling.SimpleMarshalledValue@e3036516
    in object org.infinispan.commands.write.ReplaceCommand@510cee24
    in object org.infinispan.commands.tx.PrepareCommand@4ae5ffcb

I’v seen several discusions regarding CDI serializablity ( not just for Vaadin btw ) and I’v yet to find a solution… org.jboss.weld.bean.ManagedBean is obviously part of the CDI implementation in WELD.

You could try to mark the injected ManagedBean as transient , but the implications of doing so and of deserializing your UI with injected components… I just dont know.

[code]
public class CDIViewProvider implements ViewProvider {

@Inject
private transient BeanManager beanManager;
@Inject
private transient AccessControl accessControl;

[/code]This would be the one problem to solve, the Vaadin-cdi plugin dont store the actual beans it got from the beanManager , many cdi-extentions store them in some collection for later assosiation , and these are most likely not serializable either.

Then you have the issue of any cdi injected bean and whether the actual proxy you have a reference to is serializable.