Предоставление EntityManager методом @ConversationScoped - PullRequest
0 голосов
/ 02 октября 2011

Я попытался запустить простое приложение JEE6, сгенерированное maven archetype groupId: org.fluttercode.knappsack, artifactID: jee6-sandbox-archetype в JBoss7.(прошел через это turial , извините, по-немецки)

Однако при вызове приветствия JSF я получаю следующее сообщение об ошибке:

org.jboss.weld.exceptions.IllegalProductException: WELD-000053 Producers 
  cannot declare passivating scope and return a non-serializable class:  
  [method] @Produces @DataRepository @ConversationScoped 
  public org.rap.jee6project.bean.DataRepositoryProducer.getEntityManager()
org.jboss.weld.bean.AbstractProducerBean.checkReturnValue(AbstractProducerBean.java:264)
org.jboss.weld.bean.AbstractProducerBean.create(AbstractProducerBean.java:362)
org.jboss.weld.context.AbstractContext.get(AbstractContext.java:122)

Действительно,Класс DataRepositoyProducer, который должен возвращать экземпляр EntityManager, определяется следующим образом:

@Stateless
public class DataRepositoryProducer {


private EntityManager entityManager;

@Produces @DataRepository @ConversationScoped
public EntityManager getEntityManager() {
    return entityManager;
}

@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
    this.entityManager = entityManager;
}

} 

Если я использую @RequestScoped, приложение запускается, как было обещано.Интересно, почему другие люди, которые прошли этот урок, не сталкивались с этой проблемой?И как это исправить правильно (использование @RequestScoped означает, что bean-компонент создается заново для каждого пользовательского запроса, верно?, Что я ожидаю, что он не очень эффективен)

В официальном руководстве по JEE6 говорится: " Beansэта область использования сеанса, приложения или диалога должна быть сериализуемой, но бины, которые используют область запроса, не должны быть сериализуемыми".Однако это, похоже, не является проблемой, поскольку сервер не жалуется на то, что bean-компонент не сериализуем, а является продуктом компонента-производителя.

Ответы [ 3 ]

1 голос
/ 13 февраля 2012

У меня была такая же проблема при запуске демонстрации на jboss7.

Просто удалите @ConversationScoped в getEntityManager (), и мне удалось развернуть его.

Несмотря на некоторые недостатки:

javax.servlet.ServletException: javax.faces.component.StateHolderSaver cannot be cast to [Ljava.lang.Object;    
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606) 
org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)

Я не знаю точно, связано ли это, но я так думаю.

1 голос
/ 23 августа 2012

Помните: EntityManager не сериализуем, поэтому его нельзя сохранить в ConversationScope

1 голос
/ 04 октября 2011

должно быть ..

@Stateful
@ConversationScoped
public class ProducerCreator implements Serializable{
    @PersistenceConText
    private EntityManager entityManager;
    ....
}

и если вы хотите использовать один и тот же контекст сущности в каждом диалоге, это должно быть

@PersistenceContex(type = PersistenceContextType.EXTENDED)

наконец, если вы хотите иметь сервисный уровень, создайте stateful и добавьте bean-компонент

...