2017-02-14 5 views
1

のWebSphereリバティでJNDIを使用してEJBをルックアップする方法、それは私のコード私に依存性の注入をissue.Attachedがされて投げている私はリバティアプリケーションServer.Howeverを使用して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> 

ご了承ください。

答えて

4

<jndiObjectFactory>要素を使用すると、参照されているオブジェクトのインスタンスを作成して返すjavax.naming.spi.ObjectFactoryのカスタム実装を提供できます。ただし、EJBを参照しようとしているようで、EJB参照はアプリケーションコードではなくejb機能によって提供されます。

「検索」への最も簡単な方法は、EJBは、このようなメッセージのためにはmessages.logで探すことです:

CNTR0167I:サーバはFlightServiceのエンタープライズBeanのcom.airline.service.FlightServiceインタフェースを結合さ???のWeb1.warモジュール応用。バインディングの場所は次のとおりです。java:global/????/Web1/FlightService!com.airline.service.FlightService

次に、検索文字列をバインド先の値に変更します。これは、EJBがJNDIでバインドされている場所であり、直接参照するために使用する必要があります。

EJBはjava:appおよびjava:moduleでも利用できます。これはjava:globalルックアップ文字列に似ていますが、アプリケーションまたはモジュール名は省略しています。たとえば、java:app/Web1/FlightServiceまたはjava:module/FlightServiceです。 もちろん、EJBはjava:appまたはjava:moduleの同じモジュールの同じアプリケーション内になければなりません。 EJBが単一のインタフェースのみを実装している場合は、!<interface>をオフにしてもかまいません。

EJBはjava:compで直接利用できません。ただし、java:comp/envにバインドされるEJB参照を宣言することはできます。コンプ/ ENVを、そのアプリケーションは、javaを検索可能性があります:たとえば、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> 

<ejb-ref-name>は、その後のJavaにバインドされているコンプ/ ENV/WEB1/FlightService。 <ejb-link>要素は、EJBが同じアプリケーション内にある限り、FlightServiceという名前の実際のEJBへの参照をマップします。

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

このエントリで:あなたは<ejb-link>を使用することを気にしない、またはあなたはそれを上書きしたい場合は

、それは、これに似たIBM-ウェブ-bnd.xmlにエントリを追加することによって行うことができますバインディングファイルは参照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を学んでいます。 –

関連する問題