我正在尝试使用以下组件开始使用简单的java ee应用程序:JSF 2.0,JPA EclipseLink,Glasshfish 3.
以下是一些片段,支持bean:
@Inject
private ProductsFacade model;
public void saveRow(Products p) {
model.edit(p);
}
ProductsFacade:
@Stateless
public class ProductsFacade extends AbstractFacade<Products> {
@PersistenceContext
private EntityManager em;
public void edit(Products entity) {
em.merge(entity);
}
....
Products是一个带有bean验证注释的实体bean。
现在,当用户填写表单时,'model.edit'会抛出EjbException,我处理它
有了catch,所以saveRow
支持bean方法现在看起来不那么简洁:
public void saveRow(Products p) {
try {
model.edit(p);
} catch (EJBException e) {
if(e.getCause().getClass().getName().equals("javax.validation.ConstraintViolationException")) {
handleConstraintViolation((ConstraintViolationException)e.getCause());
}
}
}
仍然玻璃鱼日志充满了“警告:javax.ejb.EJBException”和长痕迹。 我有一些问题:
EJBException
警告,以免服务器日志被污染答案 0 :(得分:1)
EJBException
都会触发当前JTA事务的回滚。对ProductsFacade#edit()
的调用启动一个事务(除非一个传播到它,这似乎不是这种情况),因为它是一个“从外部”到SessionBean的调用。如果您不希望事务在这些方案中回滚,则必须先将用户/客户端输入以某种方式验证,然后再将Entity
分配给EntityManager
。
这里有几个怪癖和事情可以避免这种情况。例如,您可以拥有ProductsFacade
句柄事务:@TransactionManagement(TransactionManagementType.BEAN)
,这将占用使用EJB的重要部分。我确实认为这种默认行为是应该的。如果您不希望在日志中使用回滚,则可以配置日志记录级别/等等 - 但我确实认为EJB分层事务回滚属于日志,它在开发过程中确实存在。