【问题标题】:JBoss EJB Client handler missing argumentJBoss EJB 客户端处理程序缺少参数
【发布时间】:2016-02-19 02:00:05
【问题描述】:

我正在尝试以下列方式设置一个新的InitialContext(我相信这是相当标准的):

private static InitialContext getInitialContext() throws NamingException {

    InitialContext context = null;

    try {
        Properties properties = new Properties();
        properties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
        properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
        properties.put(Context.PROVIDER_URL, "remote://localhost:4447");
        properties.put(Context.SECURITY_PRINCIPAL, "username");
        properties.put(Context.SECURITY_CREDENTIALS, "password");
        context = new InitialContext(properties);
        System.out.println("\n\tGot initial Context: " + context);
    } 
    catch (Exception e) {
        e.printStackTrace();
    }
    return context;
}

public static void sendMessage(RoboticsParameters object_msg) throws Exception {

    InitialContext context = getInitialContext();

    // other code
}

代码“失败”在使用属性创建new InitialContext 的行,我得到java.lang.NullPointerException。我怀疑我错过了一个论点。这是堆栈跟踪:

WARN: EJB client integration will not be available due to a problem setting up the EJB client handler java.lang.NullPointerException
at org.jboss.naming.remote.client.InitialContextFactory.<clinit>(InitialContextFactory.java:118)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:72)
at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:61)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:672)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
at javax.naming.InitialContext.init(InitialContext.java:244)
at javax.naming.InitialContext.<init>(InitialContext.java:216)

有什么建议吗?

我正在运行 JBoss EAP 6.4 并使用 EJB 3。我在类路径中有 jboss-client.jar

【问题讨论】:

  • 我认为您缺少一个属性:properties.put("jboss.naming.client.ejb.context", true);。您可以找到文档here 和示例here
  • 我试过了,但没有任何区别。
  • 您如何测试您的getInitialContext() 方法?您是否有部署在 JBoss 上的应用程序正在调用它,或者您正在通过主类调用它...?
  • @aribeiro 我正在通过一个主类调用它以进行测试。我找到了解决方案!我需要添加 maven 依赖项,而不是在类路径中添加 jboss-client.jar

标签: java jboss ejb jms initial-context


【解决方案1】:

我检查了源代码:

jboss-remote-naming/src/main/java/org/jboss/naming/remote/client/InitialContextFactory.java

并找到日志消息的来源:

public class InitialContextFactory implements javax.naming.spi.InitialContextFactory {
    // code
    private static final String REMOTE_NAMING_EJB_CLIENT_HANDLER_CLASS_NAME = "org.jboss.naming.remote.client.ejb.RemoteNamingStoreEJBClientHandler";
    // code
        try {
            klass = classLoader.loadClass(REMOTE_NAMING_EJB_CLIENT_HANDLER_CLASS_NAME);
            method = klass.getMethod("setupEJBClientContext", new Class<?>[] {Properties.class, List.class});
        } catch (Throwable t) {
            logger.warn("EJB client integration will not be available due to a problem setting up the EJB client handler", t);
        }
    // other code
}

org.jboss.naming.remote.client.ejb.RemoteNamingStoreEJBClientHandler 类在我添加到类路径的 jar 中,但由于某种原因加载类时出现问题。

然后我偶然发现了[jboss_home]/bin/client 文件夹中的这个小README-EJB-JMS.txt 文件,其中包含以下内容:

"Maven 用户不应使用此 jar,而应使用以下 BOM 依赖项

<dependencies>
    <dependency>
        <groupId>org.jboss.as</groupId>
        <artifactId>jboss-as-ejb-client-bom</artifactId>
        <type>pom</type>
    </dependency>
    <dependency>
        <groupId>org.jboss.as</groupId>
        <artifactId>jboss-as-jms-client-bom</artifactId>
        <type>pom</type>
    </dependency>
</dependencies>

这是因为使用带有阴影 jar 的 maven 很有可能导致类版本冲突,这就是为什么 我们不会将此 jar 发布到 maven 存储库。”

所以,我添加了 maven 依赖项,而不是将 jar 放在我的类路径中,瞧!有效!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 2021-03-18
    • 2016-04-14
    • 2011-04-20
    • 2015-05-21
    相关资源
    最近更新 更多