【问题标题】:Glassfish - Resource Injection not workingGlassfish - 资源注入不起作用
【发布时间】:2010-11-12 19:34:57
【问题描述】:

使用 NetBeans IDE 和 Glassfish 服务器。由于某种原因,我无法注入 DataSource(已经尝试了一百万种变体)。

private DataSource iserver;
@Resource(name="jdbc/iserver", type=DataSource.class)
public void setIServer(DataSource dataSource) {
    this.iserver = dataSource;
}

(我已经尝试将@Resource 注释直接添加到该字段)。连接池和jdbc资源是在Glassfish上配置的,暂时我已经添加了变通代码(同一个类):

ctx = new InitialContext();
iserver = (DataSource) ctx.lookup("jdbc/iserver");

解决方法代码完美运行。我在 Glassfish 日志中没有看到任何 明显 相关的错误。我确实看到了这个,但不确定它是否相关:

*name 不能在 javax.management.ObjectName.construct(ObjectName.java:405) 中为空 * 在 org.glassfish 的 javax.management.ObjectName.(ObjectName.java:1403) 中。 admingui.common.handlers.ProxyHandlers.getRuntimeProxyAttrs(ProxyHandlers.java:289) 在 org.glassfish.admingui.common.handlers.ProxyHandlers.getProxyAttrs(ProxyHandlers.java:273) 在 ...

有什么建议吗?

【问题讨论】:

    标签: jdbc dependency-injection glassfish datasource


    【解决方案1】:

    通过"lookup"-->选择"name"选项

    @Resource(lookup = "java:global/env/jdbc/__default")
    DataSource dataSource;
    

    【讨论】:

    • 文档是不是有点误导? name 属性的文档说:资源的 JNDI 名称。所以谢谢,你为我节省了很多时间!
    • 这应该是公认的答案,只要 bean 被管理,bean 范围(会话)对此没有影响。
    【解决方案2】:

    确保您在会话 bean 中,否则注入将不起作用。

    这是我如何注入的示例

    @Resource(name="jdbc/my_db") private DataSource dataSource;
    

    【讨论】:

    • 感谢您的回复。我对此完全陌生 - 当您说“确保您在会话 bean 中”时,需要在哪里指定(例如,我的类是否必须扩展 SessionBean?)
    • 注入仅在您在会话 bean 中而不是 pojo(纯 ol java 对象)中时才有效。所以,如果你正在注入,你需要在一个实现远程接口的类中,即:@Stateless(mappedName = "YourSessionBean") public class YourSessionBean implements YourSessionRemote {
    • 非常感谢!感谢您的澄清。
    猜你喜欢
    • 2016-10-01
    • 1970-01-01
    • 2023-03-05
    • 2011-02-24
    • 2015-12-16
    • 2012-01-01
    • 2022-10-25
    • 2016-03-02
    • 1970-01-01
    相关资源
    最近更新 更多