我account在JSF bean中调用EJB方法:
try{
account.someFunction(...);
}catch(SimRuntimeException e){
logger.log(Level.FATAL, "SimRuntimeException catched !");
}catch(SimNotRuntimeException e){
logger.log(Level.FATAL, "SimNotRuntimeException catched !");
}catch(Exception e){
logger.log(Level.FATAL, "Exception catched !");
}
Run Code Online (Sandbox Code Playgroud)
我的例外情况:
public class SimRuntimeException extends RuntimeException {
public SimRuntimeException() {
super();
}
}
@ApplicationException(rollback=true)
public class SimNotRuntimeException extends Exception {
public SimNotRuntimeException() {
super();
}
}
Run Code Online (Sandbox Code Playgroud)
account.someFunction(...);抛出SimRuntimeException我陷入Exception块,因为我SimRuntimeException被包裹成EJBException可能是由EJB容器.account.someFunction(...);抛出SimNotRuntimeException我属于预期成SimNotRuntimeException那么,是什么具体的区别Exception与@ApplicationException(rollback=true)和RuntimeException好吗?
我想回滚事务不是在EJB内部而是在JSF托管bean内部.在EJB内部我们可以使用SessionContext.setRollBackOnly()但是我可以在托管bean中使用什么?
@Stateless
@Local(AccountLocal.class)
public class AccountBean implements AccountLocal {
public void test1() throws CustomException(){
...
}
public void test2() throws CustomException(){
...
throw new CustomException();
}
public void test3() throws CustomException(){
...
}
public void all() throws CustomException(){
test1();
test2();
test3();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的托管bean中:
@SessionScoped
public class LoginBean implements Serializable{
public void test(){
try{
accountBean.test1();
accountBean.test2();
accountBean.test3();
}catch(CustomException e){
// WHAT HERE TO ROLLBACK TRANSACTION ?
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我怎么能保证的是,如果一个test1,test2或test3回滚,其他人将回滚呢?
我测试了这段代码, …
更新提供的实体的EJB方法(使用CMT):
@Override
@SuppressWarnings("unchecked")
public boolean update(Entity entity) throws OptimisticLockException {
// Code to merge the entity.
return true;
}
Run Code Online (Sandbox Code Playgroud)
javax.persistence.OptimisticLockException如果检测到并发更新,则将抛出,这将由调用者(托管bean)精确处理.
public void onRowEdit(RowEditEvent event) {
try {
service.update((Entity) event.getObject())
} catch(OptimisticLockException e) {
// Add a user-friendly faces message.
}
}
Run Code Online (Sandbox Code Playgroud)
但这样做会使javax.persistence表达层上的API 产生额外的依赖性,这是一种导致紧密耦合的设计气味.
应该包装哪个例外,以便完全省略紧耦合问题?或者是否有一种标准方法来处理此异常,这反过来又不会导致在表示层上强制执行任何服务层依赖性?
顺便说一句,我发现在EJB中(在服务层本身上)捕获此异常然后向客户端(JSF)返回一个标志值是笨拙的.
我正在学习一些教程后的Java持久性.
我正在使用Java EE 7和Payara服务器.
我注意到每个使用不同的持久性方法.
例子:
简单
@Stateless
public class BookServiceBean implements BookService {
@PersistenceContext
private EntityManager em;
public void createOrUpdate(Book book) {
em.persist(book);
}
public void remove(Book book) {
em.remove(book);
}
}
Run Code Online (Sandbox Code Playgroud)with flush(),这是在persistene.xml中的 "AUTO"上没有设置验证策略时使用的,对吧?
@Stateless
public class BookServiceBean implements BookService {
@PersistenceContext
private EntityManager em;
public void createOrUpdate(Book book) {
em.persist(book);
em.flush();
}
public void remove(Book book) {
em.remove(book);
em.flush();
}
}
Run Code Online (Sandbox Code Playgroud)与交易
@Stateless
public class BookServiceBean implements BookService {
@PersistenceContext
private EntityManager em;
public void …Run Code Online (Sandbox Code Playgroud)我不知道为什么我无法捕获 EJB 中的方法抛出的 NoResultException ......
try {
User user = userFacade.findByEmail(email);
userController.setSelected(user);
getSelected().setUserOid(user.getOid());
} catch (NoResultException noResultException) {
JsfUtil.addErrorMessage("No user found with provided email");
System.err.println(noResultException.getMessage());
} catch (EJBException e){
System.err.println(e.getMessage());
}
Run Code Online (Sandbox Code Playgroud)
EJB
@Stateless
public class UserFacade extends AbstractFacade<User> {
...
public User findByEmail (String email) throws NoResultException{
User user = em.createNamedQuery("User.findByEmail", User.class).
setParameter("email", email).getSingleResult();
return user;
}
...
Run Code Online (Sandbox Code Playgroud)
为什么这段代码会捕获 EJBException 而不是 NoResultException 以及如何捕获 NoResultException?
Avvertenza: javax.ejb.EJBException
...
...
Caused by: javax.persistence.NoResultException: getSingleResult() did not retrieve any entities.
Run Code Online (Sandbox Code Playgroud)