Tag: ejb

Java EE中的Facade有什么意义?

我真的不明白外立面的意义。 public abstract class AbstractFacade { private Class entityClass; public AbstractFacade(Class entityClass) { this.entityClass = entityClass; } protected abstract EntityManager getEntityManager(); 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 T find(Object id) { return getEntityManager().find(entityClass, id); } public List findAll() { […]

EJB:在PostConstruct方法中使用EntityManager

在构造bean之后,我想使用EntityManager从数据库中检索数据。 在构造函数中是不可能的,因为在调用构造函数之后注入EntityManager。 所以我尝试在用@PostConstruct注释的方法中做到这一点。 根据API,在完成所有注入后调用PostConstruct方法。 执行查询有效,但它总是返回一个空列表。 如果我在其他方法中使用相同的查询,则返回正确的结果。 有谁知道,为什么它在PostConstruct方法中不起作用? @Stateful(mappedName = “price”) @Singleton @Startup public class PriceManagementBean implements PriceManagement { @PersistenceContext private EntityManager em; private List priceSteps = Collections.synchronizedList(new ArrayList()); public PriceManagementBean(){ } @PostConstruct public void init(){ javax.persistence.Query query = em.createQuery(“SELECT ps FROM PriceStep ps”); List res = query.getResultList(); ….. } }

EJB和CDI bean序列化的最佳实践

我还没有遇到任何序列化相关的问题。 但是PMD和Findbugs发现了一系列关于序列化的潜在问题。 典型情况是注入的记录器被检测为不可序列化的。 但还有更多 – EntityManager和几个CDI bean。 我没有找到任何关于如何正确处理序列化的最佳实践。 将@Inject和@PersistenceContext注入的字段重新注入反序列化? 它们应该标记为transient吗? 或者我应该忽略/关闭代码检查? PMD建议我应该真正提供所有这些领域的访问者吗?

为什么我们必须在扩展的PersistenceContext中手动flush()EntityManager?

在我们的J2EE应用程序中,我们使用EJB-3有状态bean来允许前端代码创建,修改和保存持久性实体(通过JPA-2管理)。 它看起来像这样: @LocalBean @Stateful @TransactionAttribute(TransactionAttributeType.NEVER) public class MyEntityController implements Serializable { @PersistenceContext(type = PersistenceContextType.EXTENDED) private EntityManager em; private MyEntity current; public void create() { this.current = new MyEntity(); em.persist(this.current); } public void load(Long id) { this.current = em.find(MyEntity.class, id); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public void save() { em.flush(); } } 非常重要的是,为了避免过早提交,只有save()方法在一个事务中,所以如果我们调用create() ,我们就不会在数据库中插入任何内容。 奇怪的是,在save()方法中,我们必须调用em.flush()才能真正命中数据库。 事实上,我试过并发现我们也可以调用em.isOpen()或em.getFlushMode() ,以及任何与“em相关”的东西。 我不明白这一点。 由于save()在一个事务中,我认为在方法结束时,事务将被提交,因此持久化实体管理器会自动刷新。 […]

托管bean和会话bean之间的区别

说我有一个实体课,汽车。 @Entity public class Car 我的IDE让我自动从实体类生成会话bean,所以我最终得到了一个CarFacade @Stateless public class CarFacade 我也可以生成JSF Managed bean @ManagedBean @RequestScoped public class RegistrationController 我可以理解Entity类和其他bean之间的有意义的区别,但是无状态会话bean和托管bean之间有什么区别? 我读到一个无状态会话bean用于实现在实体上运行的业务逻辑,而托管bean用于与基于Web的前端交互,通过在托管bean上调用网页方法,并使用托管bean调用会话bean上的业务方法。 因此在我的示例中,RegistrationController将具有网页将调用的+ register(String carRegistration)方法。 RegistrationController将依次实例化Car并在会话bean上调用+ create(Car car),这会持久化它。 它是否正确?

java.rmi.MarshalException

每当我尝试从客户端调用我的ejb时,我都会收到此错误: java.rmi.MarshalException: Failed to communicate. Problem during marshalling/unmarshalling; nested exception is: java.io.InvalidClassException: com.afrikbrain.util.message.MessageInfo; local class incompatible: stream classdesc serialVersionUID = 2285009932770474121, local class serialVersionUID = -2900394430145132451 at org.jboss.remoting.transport.socket.SocketClientInvoker.handleException(SocketClientInvoker .java:122) 它为什么会发生? 以及如何解决?

如果将Jboss AS 7中的jdbc部署为Web应用程序,那么模块名称是什么

从这篇文章开始,从Jboss AS7开始,jdbc驱动程序可以作为常规应用程序进行部署。 但问题是,其他应用程序如何能够引用此jdbc jar? 这是我尝试但它不起作用 …… ….. UPDATE 当我部署ojdbc.jar时,控制台有一段日志: 10:56:20,416 INFO [org.jboss.as.server.deployment] (MSC service thread 1-8) JBAS015876: Starting deployment of “ojdbc6.jar” 10:56:21,487 INFO [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-2) JBAS010403: Deploying JDBC-compliant driver class oracle.jdbc.OracleDriver (version 11.2) 10:56:21,489 INFO [org.jboss.as.osgi] (MSC service thread 1-7) JBAS011907: Register module: Module “deployment.ojdbc6.jar:main” from Service Module Loader 10:56:21,499 INFO [org.jboss.as.server] […]

在EJB上调用期间发生系统exception

WARNING: EJB5184:A system exception occurred during an invocation on EJB EmpFacade, method: public java.util.List com.session.AbstractFacade.findAll() WARNING: javax.ejb.EJBException at com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:748) at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:698) at com.sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.java:503) at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4475) at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2009) at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1979) at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:220) at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88) at com.sun.proxy.$Proxy243.findAll(Unknown Source) at com.session.__EJB31_Generated__EmpFacade__Intf____Bean__.findAll(Unknown Source) at com.control.EntityController.processRequest(EntityController.java:62) at com.control.EntityController.doGet(EntityController.java:157) at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) […]

如何从Web模块向@WebServiceRef注入EJB

我有一个JEE6应用程序,带有一个ejb和一个web模块,在GlassFish 3.1.1上运行现在我想通过将它(作为会话Bean)注入到几个Managed Beans中来访问WebService(JAX-WS)。 @Stateless public class AnyService implements AnyServiceLocal { @WebServiceRef(wsdlLocation = “META-INF/wsdl/AnyService/Any.wsdl”) private AnyService service; @Override public String findLastname(Integer key) { Any port = service.getAnyPort(); AnyPerson sp = port.findAnynumber(key); return sp.getLastname(); } } 当我尝试访问它时: @ManagedBean @SessionScoped public class UserBean { @EJB private AnyServiceLocal any; public void findLastname() { name = any.findLastname(Integer.valueOf(key)); } } 我会得到这些例外 […]

如何在“会话”中为所有bean提供状态?

我有以下设计。 当客户端向服务器发出请求时,服务器会创建一个包含各种信息的状态。 有各种无状态和有状态的bean需要读写这个状态。 请参阅此非专业图表: ComputationCycle类是处理开始并按阶段工作的地方。 在每个阶段,它调用其他Manager类(其行为类似于实用程序类)来帮助计算(图表仅显示1个阶段)。 正在从CC类和管理者那里读取和写入状态,两者都是无状态的。 State拥有有状态的Employee , Department和Car类(在一些不相关的数据结构中)。 这些类也可以调用Manager类。 这是由一个简单的@Inject Manager1 。 CC使用经理的方式相同。 我的问题是如何从无状态类(以及Car , Department和Employee类)访问有状态(及其包含的类),尽管我认为解决一个将解决另一个问题。 我无法将有状态bean注入无状态bean。 因此,在客户端发出请求并开始计算周期后,如何访问与此请求相关的状态? 一种解决方案是将状态传递给无状态类中的每个方法,但这实际上非常麻烦和臃肿,因为所有方法都会在任何地方都有一个“愚蠢”的状态论证。 我怎样才能使这个设计按照我想要的方式工作?