【问题标题】:How to lookup EJB using JNDI in WebSphere Liberty如何在 WebSphere Liberty 中使用 JNDI 查找 EJB
【发布时间】:2017-02-14 01:25:05
【问题描述】:

我正在尝试使用 Liberty Application Server 执行 JNDI 名称搜索。但是,它给我带来了依赖注入问题。附加的是我的代码

我收到以下错误:

[ERROR   ] SRVE0319E: For the [com.airline.controllers.FlightDetails]   
 servlet, com.airline.controllers.FlightDetails servlet class was  
 found, but a resource injection failure has occurred. CWNEN0030E: The   
 server was unable to obtain an object instance for the  
 java:comp/env/com.airline.controllers.FlightDetails/flightService  
 reference.  

 The exception message was: CWNEN1003E: The server was unable to find   
 the Web1/FlightService binding with the    
 com.airline.service.FlightService type for the   
 java:comp/env/com.airline.controllers.FlightDetails/flightService   
 reference.

FlightService.java

package com.airline.service;
import java.io.Serializable;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
@Stateless
@LocalBean
public class FlightService implements Serializable {

public FlightService() {
}

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public String getFrom() {
    return from;
}

public void setFrom(String from) {
    this.from = from;
}
public String getTo() {
    return to;
}
public void setTo(String to) {
    this.to = to;
}
public Integer getPrice() {
    return price;
}
public void setPrice(Integer price) {
    this.price = price;
}
public Integer getNumOfSeats() {
    return numOfSeats;
}
public void setNumOfSeats(Integer numOfSeats) {
    this.numOfSeats = numOfSeats;
}
public String getAirplaneModel() {
    return airplaneModel;
}
public void setAirplaneModel(String airplaneModel) {
    this.airplaneModel = airplaneModel;
}
private Integer id =23467;
private String from="Los Angles";
private String to="London";
private Integer price=400;
private Integer numOfSeats=250;
private String airplaneModel="Boeing 787";

}

---------FlightDetails.java *******-------------

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
  PrintWriter out = response.getWriter();
  response.setContentType("text/html");
  try {
      flightService = (FlightService)new InitialContext().lookup("java:comp/env/Web1/FlightService");
      System.out.println(flightService);

  }
  catch(Exception ex){
      ex.printStackTrace();
  }
  if(flightService !=null){
      out.println(flightService.getAirplaneModel());
      out.println(flightService.getFrom());
      out.println(flightService.getTo());

  }

}

--------************server.xml*********----------------

<jndiObjectFactory id="flightService"                         
 className="com.airline.service.FlightService"/>
 <jndiReferenceEntry jndiName="Web1/FlightService"   
  factoryRef="flightService"/> 
 <webApplication id="Web1" location="Web1-0.0.1-SNAPSHOT.war"   
  name="Web1"/> 
 <!-- <application context-root="Web1" type="war" id="Web1"
location="Web1-0.0.1-SNAPSHOT.war" name="Web1"/>-->
</server>

任何帮助将不胜感激!

【问题讨论】:

    标签: jakarta-ee ejb jndi websphere-liberty


    【解决方案1】:

    &lt;jndiObjectFactory&gt; 元素允许您提供 javax.naming.spi.ObjectFactory 的自定义实现,它将创建并返回正在查找的对象的实例。但是,您似乎正在尝试查找 EJB,而 EJB 引用将由 ejb 功能而不是应用程序代码提供。

    “查找”EJB 的最简单方法是在 messages.log 中查找如下消息:

    CNTR0167I: 服务器正在绑定 ???? 的 Web1.war 模块中 FlightService 企业 bean 的 com.airline.service.FlightService 接口应用。绑定位置为:java:global/????/Web1/FlightService!com.airline.service.FlightService

    然后,将查找字符串更改为绑定位置的值。这是 EJB 在 JNDI 中绑定的地方,应该使用什么来直接查找它。

    EJB 也可用于 java:app 和 java:module,这类似于 java:global 查找字符串,但省略了应用程序或模块名称。例如,java:app/Web1/FlightService 或 java:module/FlightService。 当然,对于 java:app,EJB 必须在同一个应用程序中,对于 java:module,EJB 必须在同一个模块中。注意,如果 EJB 只实现一个接口,!&lt;interface&gt; 可能会被忽略。

    EJB 不能直接在 java:comp 中使用。但是,您可以声明将绑定在 java:comp/env 中的 EJB 引用。例如,web.xml 中的类似内容

      <ejb-local-ref>
        <ejb-ref-name>Web1/FlightService</ejb-ref-name>
        <ejb-ref-type>Session</ejb-ref-type>
        <local>com.airline.service.FlightService</local>
        <ejb-link>FlightService</ejb-link>
      </ejb-local-ref>
    

    &lt;ejb-ref-name&gt; 然后绑定到 java:comp/env,因此应用程序可以查找 java:comp/env/Web1/FlightService。 &lt;ejb-link&gt; 元素映射引用名为 FlightService 的真实 EJB,只要 EJB 位于同一应用程序中。

    如果您不关心使用&lt;ejb-link&gt;,或者您希望覆盖它,可以通过在 ibm-web-bnd.xml 中添加一个类似于此的条目来完成:

    <ejb-ref name="Web1/FlightService" binding-name="java:global/????/Web1/FlightService!com.airline.service.FlightService"/>
    

    绑定文件中的这个条目将引用 java:comp/env/Web1/FlightService 映射到真正的 EJB java:global/????/Web1/FlightService!com.airline.service.FlightService。

    【讨论】:

      【解决方案2】:

      由于您尝试从 servlet 访问无状态 EJB,因此最简单的方法是将 EJB 注入 servlet 类中:

      @EJB
      private FlightService flightService;
      

      而不是使用initialcontext.lookup。那么你根本不必关心 JNDI 名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多