2017-02-14 42 views
1

Я пытаюсь выполнить поиск по имени JNDI с помощью Liberty Application Server.However, он бросает мне инъекцию в зависимости issue.Attached моего кодаКак для поиска EJB с помощью JNDI в WebSphere Liberty

Я получаю следующее Ошибка:

[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> 

Любая помощь будет оценена!

ответ

4

Элемент <jndiObjectFactory> позволяет вам создать пользовательскую реализацию javax.naming.spi.ObjectFactory, которая будет создавать и возвращать экземпляр объекта, который просматривается. Однако, похоже, вы пытаетесь найти EJB, а ссылки EJB будут предоставляться функцией ejb, а не кодом приложения.

Самый простой способ «поиска» EJB-компонент должен смотреть в messages.log для сообщения, как это:

CNTR0167I: Сервер связывания интерфейса com.airline.service.FlightService в FlightService бина в модуле Web1.war ???? заявление. Место привязки: java: global/????/Web1/FlightService! Com.airline.service.FlightService

Затем измените строку поиска на значение места привязки. Здесь EJB связан в JNDI, и что нужно использовать для прямого поиска.

EJB также доступны в java: app и java: module, который будет похож на строку поиска java: global lookup, но не содержит имя приложения или модуля. Например, java: app/Web1/FlightService или java: module/FlightService. Конечно, EJB должен быть в одном приложении для java: app или того же модуля для модуля java:. Обратите внимание: !<interface> может быть остановлен, если EJB реализует только один интерфейс.

EJBs не доступны непосредственно в java: comp. Однако вы можете объявить ссылку EJB, которая будет связана в java: comp/env. Например, что-то подобное в 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> 

The <ejb-ref-name> затем связывается в Java: COMP/окр, так что приложение может LookUp Java: комп/ENV/Web1/FlightService. Элемент <ejb-link> отображает ссылку на настоящий EJB с именем FlightService, если EJB находится в одном приложении.

Если вы не заботитесь, чтобы использовать <ejb-link>, или вы хотите изменить его, что может быть сделано путем добавления записи в Ibm-веб-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.

-1

Так как вы пытаетесь получить доступ без гражданства EJB из сервлета, проще всего было бы просто внедрить EJB в класс сервлета как:

@EJB 
private FlightService flightService; 

вместо использования initialcontext.lookup. Тогда вам вообще не нужно заботиться о именах JNDI.

+0

Я знаю, что мы можем это сделать, я изучаю JNDI. –

 Смежные вопросы

  • Нет связанных вопросов^_^