未调用 EJB 中覆盖的 toString 方法

Overridden toString method in EJB not invoked

我 studying/experimenting 使用 EJB。我有一个带有重写 toString 方法的 EJB:

@Stateless
@LocalBean
public class FlightService {
... 
@Override
public String toString() {
    return "FlightService [id=" + id + ", from=" + from + ", to=" + to + ", price=" + price + ", airplaneModel="
            + airplaneModel + "]";
}

}

在我的 servlet 中,我将这个 EJB 注入到一个变量中,如下所示:

@EJB
private FlightService fs;

但是,当我想把它打印出来时..

if (fs != null){
    out.println("Flight details: " + fs.toString());
}

..我得到以下输出,我想这就是我使用默认 toString 方法得到的结果。

Flight details: com.airline.service.__EJB31_Generated__FlightService__Intf___754270295

而不是

Flight details: FlightService [id=123, ...]

如我所料。据我所知,EJB 的所有其他功能都按预期工作。有人可以向我解释 toString 方法会发生什么吗?谢谢!

编辑:按照 Soumitri Pattnaik 的建议,它适用于显式创建的对象 (new FlightService())。

EDIT2:pastebin 上提供了完整的源代码。 FlightService.java, FlightDetails.java 该项目是在 Eclipse 中创建的,运行 在 Glassfish 4 上。

@EJB 不注入实际实例。 @EJB 注入一个自动生成的代理实例,该实例在池中定位实际实例并委托给它。根据使用的 EJB 实现(阅读:取决于使用的应用程序服务器),自动生成的代理 class 可能有自己的 toString(),它可能会或可能不会使用您的 toString()。你的显然完全忽略了它。

另请参阅:

  • When using @EJB, does each managed bean get its own @EJB instance?