2017-02-14 87 views
1

我试图执行使用自由应用Server.However一个JNDI名称搜索,它扔我一个依赖注入issue.Attached是我的代码如何查找使用JNDI EJB在WebSphere自由

我正在以下错误:

[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

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

EJB也可用于java:app和java:模块,它与java:global查找字符串类似,但省略了应用程序或模块名称。例如,java:app/Web1/FlightService或java:module/FlightService。 当然,EJB必须位于java:app的相同应用程序或java:module的相同模块中。请注意,如果EJB仅实现单个接口,则!<interface>可能会被关闭。

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> 

<ejb-ref-name>这样的事情,然后结合成Java:comp/env的,因此应用程序可以查找的java:comp/env的/ WEB1/FlightService。只要EJB位于相同的应用程序中,就可以引用名为FlightService的真实EJB的<ejb-link>元素映射。

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

该条目:

如果你不小心使用<ejb-link>,或者您希望覆盖它,可以通过添加IBM的web-bnd.xml类似下面的条目进行绑定文件将引用java:comp/env/Web1/FlightService映射到真正的EJB java:global/????/Web1/FlightService!com.airline.service.FlightService。

-1

既然你正试图从Servlet访问无状态EJB,最简单的将是刚刚在servlet类注入EJB为:

@EJB 
private FlightService flightService; 

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

+0

我知道我们可以做到这一点,我正在学习JNDI。 –