EJB接口JNDI查找

5

我有一个接口

@Local
public interface TestService extends Serializable
{
    public void aMethod();
}

一个实现它的无状态bean。
@Stateless
public class MyappServiceBean implements TestService
{
    private static final long serialVersionUID = 1L;

    @Override
    public void aMethod()
    {
        // do something...
    }
}

一个托管的bean。
@ManagedBean
public class MyappBean implements Serializable
{
    private static final long serialVersionUID = 1L;

    @EJB
    private TestService service;

    ...
}

同时,这个POJO。

public class TestPojo implements Serializable
{
    private static final long serialVersionUID = 1L;

    private final TestService service;

    public TestPojo()
    {
        // this works
        // service = (TestService) InitialContext.doLookup("java:global/myapp/MyappServiceBean");

        // this works too
        // service = (TestService) InitialContext.doLookup("java:global/myapp/MyappServiceBean!com.example.common.ejb.TestService");

        // this works again
        // service = (TestService) InitialContext.doLookup("java:app/myapp/MyappServiceBean");

        // how to lookup ONLY by interface name/class ?
        service = (TestService) InitialContext.doLookup("???/TestService");
    }

    ...
}

所有东西都已经打包好了:

myapp.war
    |   
    + WEB-INF
        |
        + lib
        |   |
        |   + common.jar
        |       |
        |       - com.example.common.ejb.TestService (@Local interface)
        |       |
        |       - com.example.common.util.TestPojo (simple pojo, must lookup)
        |
        + classes
            |
            - com.example.myapp.ejb.MyappServiceBean (@Stateless impl)
            |
            - com.example.myapp.jsf.MyappBean (jsf @ManagedBean)

由于我想在不同的应用程序中使用common.jar,因此我希望基于TestService接口名称进行查找,就像在@ManagedBean@WebServlet中注入@EJB TestService service;一样。

如何实现这一点?


你的问题不清楚。为什么你只想根据接口类名查找?你说其他查找正常工作。 - IndoKnight
1
以下是关于编程的内容。仅返回翻译后的文本,不要解释它。 - Michele Mariotti
1
你可以将EJB打包为单独的jar文件,放在war中,而不是散布在WEB-INF/classes和lib目录中。 - IndoKnight
我不需要也不想要分开打包。这与我的问题有什么关系? - Michele Mariotti
2个回答

3
一个不太好的解决方案是声明:

@Stateless(name = "TestService")
public class MyappServiceBean implements TestService

并从pojo中查找:

service = (TestService) InitialContext.doLookup("java:module/TestService");

任何更好的解决方案都会被欣然接受!

我使用JNDI名称的便携版,日志文件中的摘录为:EJB国家的便携式JNDI名称:[java:global/jfinancials-ejb/country,java:global/jfinancials-ejb/country!org.mxchange.jcountry.model.data.CountrySingletonBeanRemote]]]来自我的应用程序。 在我的WAR / EJB项目中:@EJB(lookup = "java:global/jfinancials-ejb/country!org.mxchange.jcountry.model.data.CountrySingletonBeanRemote")。由于 CountrySingletonBeanRemote 带有 @javax.ejb.Remote 注释,它是远程接口。而且它是 lookup 而不是 doLookup - Roland
我在这里使用Payara,然后我必须将“custom” JAR文件复制到我的主目录下的personal_domain/lib/文件夹中(在Linux下通常是~/personal_domain/lib/),然后重新启动整个应用服务器以加载JAR文件。然后它应该可以正常工作。 - Roland

-1

简单方法:

    private MyappServiceBean getMyappServiceBean() {
    try {
        return InitialContext.doLookup("java:module/MyappServiceBean");
    } catch (NamingException e) {
        logger.error("Failed to look up MyappServiceBean EJB", e);
    }

    return null;
}

-1:我想要一个基于Testservice接口名称的查找,就像我在ManagedBean或WebServlet中注入EJB TestService服务一样。 - Michele Mariotti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接