当前位置: 首页 > 知识库问答 >
问题:

使用来自不同JAR的EJB

韦阳晖
2023-03-14

我正在JDeveloper 11.1.1.4中开发一个JAX-WS Web服务,它应该使用以前部署到WebLogic服务器的JAR中的EJB。WebService项目和EJB项目都是我自己的代码,但我想分别部署它们。现在我正在试验这种设置。

在Examplejb项目中,我有一个实现远程接口示例的bean ExampleBean。

@Remote
public interface Example {
    public String doRemoteStuff();
}

@Stateless(name = "Example", mappedName = "ExampleApplication-ExampleEJB-Example")
public class ExampleBean implements Example {
    public String doRemoteStuff() {
        return "did remote stuff";
    }
}

在该项目中,我有两个部署描述符(ejb-jar.xml和weblogic ejb-jar.xml):

ejb-jar.xml

<?xml version = '1.0' encoding = 'UTF-8'?>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
         version="3.0" xmlns="http://java.sun.com/xml/ns/javaee">
  <enterprise-beans>
    <session>
      <ejb-name>Example</ejb-name>
    </session>
  </enterprise-beans>
</ejb-jar>

weblogic-ejb-jar.xml

<?xml version = '1.0' encoding = 'UTF-8'?>
<weblogic-ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-ejb-jar http://www.bea.com/ns/weblogic/weblogic-ejb-jar/1.0/weblogic-ejb-jar.xsd"
                  xmlns="http://www.bea.com/ns/weblogic/weblogic-ejb-jar">
  <weblogic-enterprise-bean>
    <ejb-name>Example</ejb-name>
    <stateless-session-descriptor/>
  </weblogic-enterprise-bean>                  
</weblogic-ejb-jar>

此外,我还创建了一个名为example EJB的EJB JAR部署概要文件。jar并设法将其部署到服务器上。

我有一个示例WebService项目:

@WebService(serviceName = "ExampleWebService")
public class ExampleWebService {

    @EJB
    Example example;

    public String doStuff() {
        return example.doRemoteStuff();
    }
}

我在这个项目中添加了Examplejb项目依赖项(这样它就可以编译了)。我在这个项目中仅有的XML是web。用于描述servlet的xml。此外,在创建Web服务时,我有一个由jDeveloper自动创建的Web服务WAR文件。最后,我创建了一个名为example ws的EAR部署配置文件,它在应用程序集中只包含WebServices WAR文件。

我需要做什么才能成功?此外,如果从另一个项目(例如,AdditionalCEPLEEJB)引用了具有使用CEPLEBean的附加bean,那么过程会是什么?我如何从那里引用示例豆?

非常感谢你能给我的任何帮助!

编辑:

我已经设法从WebService引用了EJB!

在Examplejb项目中,我修改了weblogic ejb jar。xml,现在看起来是这样的:

weblogic-ejb-jar.xml

<?xml version = '1.0' encoding = 'UTF-8'?>
<weblogic-ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-ejb-jar http://www.bea.com/ns/weblogic/weblogic-ejb-jar/1.0/weblogic-ejb-jar.xsd"
                  xmlns="http://www.bea.com/ns/weblogic/weblogic-ejb-jar">
  <weblogic-enterprise-bean>
    <ejb-name>Example</ejb-name>
    <stateless-session-descriptor>
      <pool>
        <max-beans-in-free-pool>10</max-beans-in-free-pool>
        <initial-beans-in-free-pool>3</initial-beans-in-free-pool>
      </pool>
      <business-interface-jndi-name-map>
        <business-remote>hr.example.Example</business-remote>
        <jndi-name>ejb/example-ejb/Example</jndi-name>
      </business-interface-jndi-name-map>
    </stateless-session-descriptor>
  </weblogic-enterprise-bean>                  
</weblogic-ejb-jar>

在ExampleWS项目中,我添加了一个部署描述符weblogic。如下所示的xml:

weblogic。xml

<?xml version = '1.0' encoding = 'UTF-8'?>
<weblogic-web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-web-app http://www.bea.com/ns/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd"
                  xmlns="http://www.bea.com/ns/weblogic/weblogic-web-app">
  <ejb-reference-description>
    <ejb-ref-name>ExampleReference</ejb-ref-name>
    <jndi-name>ejb/example-ejb/Example</jndi-name>
  </ejb-reference-description>
</weblogic-web-app>

请注意,ExampleReference值和ejb/example ejb/example值是我决定输入的内容——我认为它们或多或少是开发人员的选择。

另外,我在我的WebService中引用了EJB,使用的值是示例引用值,所以我的示例WebService看起来像这样:

示例Web服务

@WebService(serviceName = "ExampleWebService")
public class ExampleWebService {
    @EJB(
      name="ExampleReference"
    )
    Example example;

    public String doStuff() {
        return example.doRemoteStuff();
    }
}

最后,在ExampleWS(WebServices.war)的部署配置文件中,我添加了依赖项贡献者,并检查了接口示例。类元素(不是具有实现的ExampleBean.java)。

现在,如果示例bean是从另一个EJB项目(而不是Web服务)引用的,这将如何工作?

共有1个答案

陈高寒
2023-03-14

所以,对于所有遇到同样问题的人,我已经解决了。除了使用InitialContext,在EJB3.0中无法查找远程EJB。查找(“jndi/name”)。此外,在某些ClassCastException情况下,缩小对象范围似乎有帮助,所以我倾向于这样做作为预防措施。以下是我查找EJB的方式:

import javax.naming.InitialContext;
import javax.naming.NamingException;

import javax.rmi.PortableRemoteObject;

public Object lookup (String jndiName, Class type) throws NamingException {
    return PortableRemoteObject.narrow(InitialContext.doLookup(jndiName), type);
}

如果使用EJB 3.1,有一种方法使用@EJB(lookup="jndi/name"),但是因为我没有使用这个版本,我不能保证这个工作。

 类似资料:
  • 问题内容: 当要依赖的测试与具有此批注的测试属于同一类时,批注的属性可以正常工作。但是,如果要测试的方法和依赖的方法位于不同的类中,则该方法不起作用。示例如下: 有什么办法可以解决这个限制?一种简单的解决方法是在该调用中创建测试。但这将是过多的重复。 问题答案: 将方法放在中并使用。 建议验证*中的配置,并在该处出现问题时抛出错误,以使测试无法运行。这样,测试可以只关注测试。

  • 编辑:我今天早上意识到这个异常似乎与Spring引导执行器有关,它似乎只在生产中运行,而不是在从Spring工具套件中启动prohect时运行。(请参见文章末尾的异常跟踪) 主数据库是使用jpa访问的,关于该数据库的所有内容都在一个特定的包中。 另一个数据库用于直接使用Hibernate访问遗留bean。关于那些遗留bean的一切都在一个不同的包中。 有些bean在两个包中具有相同的名称,但是由于

  • 我想使用ManagedBean类Users。java,创建两个具有不同作用域的bean实例。我尝试了两种方法: 1.为用户使用ManagedBean和SessionScope注释(这将创建一个带有会话范围的用户),并在faces-config.xml声明另一个来自用户的MenagedBean,带有请求范围。 注意:“组件”来自Spring框架,暂时可以忽略。 在faces-config.xml:

  • 我有一个场景,我已经在不同的节点上部署了4个Kafka消费者实例。我的主题有4个分区。现在,我想配置消费者,使他们都从主题的不同分区获取。 我知道一个事实,如果消费者来自同一个消费者组,他们会确保分区被平分。但在我的情况下,他们不在同一组。

  • 我开发了一个简单的代码,通过在实体类“employee”和“Department”上使用JPA的CRUD操作(find)来显示员工姓名。在运行代码时,它工作正常,但真正的问题来了,当我从应用程序创建一个jar文件时,jar文件出现了一个异常,我将该异常写在一个txt文件中 下面是Employee类 下面是显示员工姓名和学位的类 下面是异常“exception[EclipseLink-28019](

  • 我制作了一个Java应用程序,它使用Maven、JavaFX和一些其他依赖项。以前,构建一个可执行jar很容易,但由于Java11是模块化的,不包含JavaFX,所以我无法构建一个工作的jar。 我已经尝试了很多事情,但我不知道我现在应该做什么。 我的pom。xml 我试图构建包含所有依赖项的工件,但在运行(java-jar)时出现了一个错误: 编辑 我曾尝试使用Jlink构建一个包含JavaFX