我在一个名为“interface”的maven项目中得到了两个接口类(实际上是三个):
@Local
public interface CrudSessionLocal extends CRUDS {
}
public interface ExceptionThrower {
public boolean isThrowException();
public void setThrowException(boolean throwException);
}
我在一个名为“server”的maven项目中得到了一个bean(它依赖于“interface”-project),它实现了这些接口:
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class CrudsTransactionSessionBean implements CrudSessionLocal, ExceptionThrower {
我在一个名为“web-client”的maven项目中得到了一个servlet(它依赖于“interface”-project,但不依赖于“server”-project)。servlet使用bean,如下面的代码所示,注意声明使用接口。
@EJB(beanName = "CrudsTransactionSessionBean")
private CrudSessionLocal crudSessionLocal;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if( crudSessionLocal instanceof ExceptionThrower ) {
ExceptionThrower exceptionThrower = (ExceptionThrower)crudSessionLocal;
exceptionThrower.setThrowException(throwException);
}
我认为在servlet中的bean成员声明中使用接口是一个很好的实践。例如,我认为可以在另一个耳朵中重用interface.jar和web-client.jar,但使用另一个服务器层(如other_server. jar),该服务器层包含另一个bean,只要该bean名为“CrudsTransactionSessionBean”并实现接口,该bean就可以做其他事情。
在这种情况下,bean还实现了接口ExceptionThrower,其思想是如果bean是ExceptionThrower的示例,则在servlet中进行检查,然后抛出异常。
但令我惊讶的是,在运行时,member-bean不是ExceptionThrower的示例,而是:“cruds.server.crudsTransactionSessionBean_d7q6e8_CrudSessionLocalImpl@617fe9e5”(我觉得这听起来像是一个CrudsTransactionSessionBean,它实现了异常抛出程序)
我想我可以这样做,但是我不能完成jar依赖项之间的“松耦合”。
@EJB(beanName = "CrudsTransactionSessionBean")
private CrudsTransactionSessionBean crudSessionLocal;
你们知道为什么会发生这种情况吗?为了实现“松耦合”,我应该如何解决它?
顺便说一句,我使用Java 8和Weblogic 14
问候弗雷德里克
1条答案
按热度按时间o75abkj41#
应用服务器通常会为会话bean注入dynamic proxies来实现EJB特性,比如事务处理,这样的代理只实现会话bean接口,而不公开会话bean实现的其他细节。