Я попытался запустить простое приложение 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-компонент не сериализуем, а является продуктом компонента-производителя.