java 当我使用@EJB时,Instanceof不起作用,这是为什么?

qojgxg4l  于 2023-01-04  发布在  Java
关注(0)|答案(1)|浏览(126)

我在一个名为“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
问候弗雷德里克

o75abkj4

o75abkj41#

应用服务器通常会为会话bean注入dynamic proxies来实现EJB特性,比如事务处理,这样的代理只实现会话bean接口,而不公开会话bean实现的其他细节。

相关问题