我目前正在JBoss AS 5.0.0.GA上开发基于EJB 3.0的应用程序,最近在服务器日志中出现了以下警告:
09:50:19,735 WARN [InterceptorsFactory] EJBTHREE-1246: Do not use InterceptorsFactory with a ManagedObjectAdvisor, InterceptorRegistry should be used via the bean container 09:50:19,735 WARN [InterceptorsFactory] EJBTHREE-1246: Do not use InterceptorsFactory with a ManagedObjectAdvisor, InterceptorRegistry should be used via the bean container 09:50:19,735 WARN [InterceptorRegistry] applicable interceptors is non-existent for ... ...
只要将EJB(无状态会话bean)注入到我的JSF Web应用程序的支持bean中,就会生成警告.虽然bean确实可以正常工作,但我仍然想知道警告来自哪里以及我可以做些什么来避免它.
我已经搜索了一下,但没有找到一个好的答案(有人说,bean开发人员不必担心,但它是一个警告,所以我想有一个更好的解决方案):
那么有没有人解释导致警告的原因(对于bean开发人员,而不是应用程序服务器开发人员)以及如何避免它?
我想知道,为什么不使用Session Bean而不是Message Driven Beans?
如果您可以从EJB调用远程方法,那么为什么还要使用Message Driven Beans(比会话bean更难开发)来发送/接收消息呢?
Message Driven Beans在哪些场景中变得有用?
我正在实现一个抛出ApplicationException
s 的会话bean .这些异常具有链式堆栈跟踪,这些跟踪可能包含客户端上不可用的类的异常.就像是:
@Override
public void doSomethingSpecial(MyObject o) throws MyException {
try {
legacySystem.handle(o);
} catch (LegacyException e) {
logger.warn(e.getMessage(), e);
throw new MyException(e);
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,客户端可能会获得一个没有类的异常.这可能导致:
Exception in thread "main" java.lang.reflect.UndeclaredThrowableException
at sun.proxy.$Proxy0.doSomethingSpecial(Unknown Source)
at com.myapp.client.Client.main(Client.java:56)
Caused by: java.lang.ClassNotFoundException: MyLegacyException
Run Code Online (Sandbox Code Playgroud)
我不希望客户端知道可以在服务器端抛出的所有可能的异常,但是拥有堆栈跟踪永远不会坏.
你是如何处理这些问题的?Interceptor
在将异常发送回客户端时,实现将堆栈跟踪解耦的可行解决方案是什么?但是那时Interceptor
应该只处理通过的调用RemoteInterface
,因为内部我对整个堆栈跟踪感兴趣.
我正在编写一个应用程序,它的唯一目的是为了维护数据库中的记录而进行CRUD操作.某些表/实体之间存在关系.我已经看到了创建会话bean实例大多涉及与复杂的业务逻辑/操作,与我没有很多的实体交互.
由于我的应用程序非常基础,会话bean的最佳设计是什么?
我想每个实体有一个会话bean,它有CRUD定义的方法.然后我想到将所有会话bean组合到一个会话bean中.然后我发现这个博客条目很有趣,但我必须承认我并不了解所有这些(什么是ServiceFacade?).
我倾向于会话bean /实体类,但希望听到更多有经验的意见.
谢谢.
哎呀,这是博客链接:http://www.adam-bien.com/roller/abien/entry/generic_crud_service_aka_dao
在会话bean代码上使用静态变量是不可能的.这种限制是任意的还是基本的?为什么?
最好的祝福
对于以下解决方案,您会建议一个好的,实用但简单的模式:
是否有必要使用自己的DAO层来保持持久性?我使用JPA将对象持久保存到我的数据库中.
我应该从EJB中撤销业务逻辑吗?所有在线资源都告诉我不同的事情并让我感到困惑......
在我将一些数据提交到数据库之后,我希望我的会话bean自动刷新自己以反映最近提交的数据.在JSF 2.0中使用托管会话bean时,如何实现这一目标?
目前,我必须重新启动Web服务器才能清除会话并重新加载.
所以我从BalusC的这篇文章中读到了如何阻止无状态会话bean在被JSF访问时不断地颠簸数据存储(例如DB)(这可能会/将进行多次调用)所以我已经实现了我的代码我想这是符合BalusC所发布的精神(以及我见过的关于这个问题的"最佳实践"的其他论坛帖子).
我的无状态会话bean看起来像这样:
@Stateless
@Named("productsService")
public class ProductService {
private static boolean changed = true;
private List<Product> products;
private long count;
@PersistenceContext(name = "myPU")
private EntityManager em;
@Inject
private Product product;
public ProductService() {
}
private void productRecordsFromDB() {
products = em.createNamedQuery("Product.getAll", Product.class).getResultList();
Object o = em.createNamedQuery("Product.getCount", Product.class).getSingleResult();
count = ((Long) o).longValue();
}
public void addProduct() {
synchronized (ProductService.class) {
changed = true;
em.persist(product);
}
}
public long countProducts() {
return count;
}
public void removeProduct(Product p) …
Run Code Online (Sandbox Code Playgroud) session-bean ×8
java ×4
java-ee ×4
ejb-3.0 ×3
ejb ×2
distribution ×1
ejb-3.1 ×1
javabeans ×1
jboss ×1
jpa ×1
jsf ×1
managed-bean ×1
rmi ×1
warnings ×1