@EJB в @ViewScoped @ManagedBean вызывает java .io.NotSerializableException

Я читал @EJB в @ViewScoped управляемый компонент вызывает исключение java.io.NotSerializableException , но моя настройка сохранения состояния - сервер .

Вот что у меня есть:

web.xml :



    sispra
    
        index.jsf
    
    
        Faces Servlet
        javax.faces.webapp.FacesServlet
        1
    
    
        Faces Servlet
        *.jsf
    

    
        PrimeFaces FileUpload Filter
        org.primefaces.webapp.filter.FileUploadFilter
    
    
        PrimeFaces FileUpload Filter
        Faces Servlet
    

    
        javax.faces.PROJECT_STAGE
        Development
    
    
        javax.faces.STATE_SAVING_METHOD
        server
    
    
        facelets.BUILD_BEFORE_RESTORE
        true
    
    
        org.apache.myfaces.ALLOW_JAVASCRIPT
        true
    
    
        org.apache.myfaces.PRETTY_HTML
        true
    
    
        org.apache.myfaces.DETECT_JAVASCRIPT
        false
    
    
        org.apache.myfaces.AUTO_SCROLL
        true
    
    
        primefaces.THEME
        glass-x
    
    
        
            Secure Application
            /*
            GET
            POST
        
        
            user
        
    
    
        BASIC
        fileRealm
    
    
        30
    
    
        user
    

customer.xhtml :


      

    
        TODO supply a title
    

    

        

        

            

            
                
                    
                

                

                    
                    
                    

                    
                    
                    

                
            

        

    

CustomerController.java :

package it.shape.sispra.controllers;

import it.shape.sispra.ejb.PersonFacade;
import it.shape.sispra.entities.Customer;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class CustomerController extends AbstractController
{
    private static final long serialVersionUID = 134755304347034L;

    @EJB
    private PersonFacade facade;

    public CustomerController()
    {
        super(Customer.class);
    }

    @Override
    public PersonFacade getFacade()
    {
        return facade;
    }
}

PersonFacade.java :

package it.shape.sispra.ejb;

import it.shape.sispra.entities.Person;
import javax.ejb.Stateless;

@Stateless
public class PersonFacade extends AbstractFacade
{
    private static final long serialVersionUID = 4357823648345L;

    public PersonFacade()
    {
        super(Person.class);
    }

}

AbstractFacade.java:

package it.shape.sispra.ejb;

import it.shape.sispra.entities.AbstractEntity;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import org.eclipse.persistence.jpa.JpaHelper;
import org.eclipse.persistence.queries.QueryByExamplePolicy;
import org.eclipse.persistence.queries.ReadAllQuery;
import org.eclipse.persistence.queries.ReadObjectQuery;

public abstract class AbstractFacade implements Serializable
{
    private static final long serialVersionUID = 12467890452346123L;

    @PersistenceContext(unitName = "sispra")
    private EntityManager em;

    private final Class entityClass;

    public AbstractFacade(Class entityClass)
    {
        this.entityClass = entityClass;
    }

    public EntityManager getEntityManager()
    {
        return em;
    }

    public void create(T entity)
    {
        getEntityManager().persist(entity);
    }

    public void edit(T entity)
    {
        getEntityManager().merge(entity);
    }

    public void remove(T entity)
    {
        getEntityManager().remove(getEntityManager().merge(entity));
    }

    public void refresh(T entity)
    {
        getEntityManager().refresh(entity);
    }

    public T find(Object id)
    {
        return getEntityManager().find(entityClass, id);
    }

    public List findAll()
    {
        CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(entityClass);
        cq.select(cq.from(entityClass));

        return getEntityManager().createQuery(cq).getResultList();
    }

    public List findRange(int first, int max)
    {
        CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(entityClass);
        cq.select(cq.from(entityClass));

        TypedQuery q = getEntityManager().createQuery(cq);
        q.setMaxResults(max);
        q.setFirstResult(first);

        return q.getResultList();
    }

    public int count()
    {
        CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(Long.class);
        Root rt = cq.from(entityClass);
        cq.select(getEntityManager().getCriteriaBuilder().count(rt));
        TypedQuery q = getEntityManager().createQuery(cq);
        return q.getSingleResult().intValue();
    }

    @SuppressWarnings("unchecked")
    public T findByExample(T entity)
    {
        // Create a native EclipseLink query using QBE policy
        QueryByExamplePolicy policy = new QueryByExamplePolicy();
        policy.addSpecialOperation(String.class, "like");

        ReadObjectQuery roq = new ReadObjectQuery(entity, policy);

        // Wrap the native query in a standard JPA Query and execute it
        Query query = JpaHelper.createQuery(roq, getEntityManager());

        return (T) query.getSingleResult();
    }

    @SuppressWarnings("unchecked")
    public List findAllByExample(T entity)
    {
        // Create a native EclipseLink query using QBE policy
        QueryByExamplePolicy policy = new QueryByExamplePolicy();
        policy.addSpecialOperation(String.class, "like");

        ReadAllQuery raq = new ReadAllQuery(entity, policy);

        // Wrap the native query in a standard JPA Query and execute it
        Query query = JpaHelper.createQuery(raq, getEntityManager());

        return query.getResultList();
    }

    @SuppressWarnings("unchecked")
    public List findByExample(T entity, int start, int max)
    {
        // Create a native EclipseLink query using QBE policy
        QueryByExamplePolicy policy = new QueryByExamplePolicy();
        policy.addSpecialOperation(String.class, "like");

        ReadAllQuery raq = new ReadAllQuery(entity, policy);

        // Wrap the native query in a standard JPA Query and execute it
        Query query = JpaHelper.createQuery(raq, getEntityManager());
        query.setFirstResult(start);
        query.setMaxResults(max);

        return query.getResultList();
    }

    public int countByExample(T entity)
    {
        //TODO find a better way...
        return findAllByExample(entity).size();
    }
}

, а это трассировка стека:

GRAVE: Exiting serializeView - Could not serialize state: com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate
java.io.NotSerializableException: com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
  at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
  at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
  at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
  at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
  at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
  at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
  at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
  at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
  at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
  at java.util.HashMap.writeObject(HashMap.java:1001)
  at sun.reflect.GeneratedMethodAccessor45.invoke(Unknown Source)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  at java.lang.reflect.Method.invoke(Method.java:597)
  at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
  at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)
  at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
  at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1346)
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1154)
  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
  at java.util.HashMap.writeObject(HashMap.java:1001)
  at sun.reflect.GeneratedMethodAccessor45.invoke(Unknown Source)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  at java.lang.reflect.Method.invoke(Method.java:597)
  at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
  at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)
  at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
  at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1346)
  at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1154)
  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
  at org.apache.myfaces.renderkit.ServerSideStateCacheImpl.serializeView(ServerSideStateCacheImpl.java:357)
  at org.apache.myfaces.renderkit.ServerSideStateCacheImpl.saveSerializedViewInServletSession(ServerSideStateCacheImpl.java:220)
  at org.apache.myfaces.renderkit.ServerSideStateCacheImpl.saveSerializedView(ServerSideStateCacheImpl.java:798)
  at org.apache.myfaces.renderkit.html.HtmlResponseStateManager.saveState(HtmlResponseStateManager.java:127)
  at org.apache.myfaces.application.StateManagerImpl.saveView(StateManagerImpl.java:166)
  at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1554)
  at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:281)
  at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:85)
  at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:239)
  at javax.faces.webapp.FacesServlet.service(FacesServlet.java:191)
  at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
  at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
  at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
  at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
  at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
  at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
  at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
  at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
  at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
  at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
  at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
  at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
  at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
  at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
  at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
  at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
  at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
  at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
  at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
  at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
  at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
  at java.lang.Thread.run(Thread.java:662)

Я знаю, что могу обойти это, объявив PersonFacade как transient и используя JNDI для получения ссылки на EJB после восстановления. , но мне такой подход очень не нравится.

Возможно ли, что Glassfish 3.1.1 предоставляет несериализуемые EJB-компоненты? Есть ли способ использовать @EJB и @ViewScoped вместе?

обновление: Я обнаружил, что это проблема, связанная с MyFaces, все отлично работает с использованием моджарры

8
задан Community 23 May 2017 в 12:07
поделиться