I am trying to run the following example for a quite sometime in eclipse.
https://github.com/jboss-developer/jboss-eap-quickstarts/tree/master/ejb-remote
I have created an ejb project and imported all the class files and put .properties files in META-INF. now there is no error in code and ejbs are deployed on JBoss server successfully. When I try to run RemoteEJBClient.java, I am getting following exception, which I am not able to fix.
Exception in thread "main" javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.lookup(Unknown Source)
at org.jboss.as.quickstarts.ejb.remote.client.RemoteEJBClient.lookupRemoteStatelessCalculator(RemoteEJBClient.java:131)
at org.jboss.as.quickstarts.ejb.remote.client.RemoteEJBClient.invokeStatelessBean(RemoteEJBClient.java:50)
at org.jboss.as.quickstarts.ejb.remote.client.RemoteEJBClient.main(RemoteEJBClient.java:37)
please help me in sort out this issue
main standalone class:
/*
* JBoss, Home of Professional Open Source
* Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual
* contributors by the @authors tag. See the copyright.txt in the
* distribution for a full listing of individual contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.as.quickstarts.ejb.remote.client;
import org.jboss.as.quickstarts.ejb.remote.stateful.RemoteCounter;
import org.jboss.as.quickstarts.ejb.remote.stateless.RemoteCalculator;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Hashtable;
/**
* A sample program which acts a remote client for a EJB deployed on AS7 server.
* This program shows how to lookup stateful and stateless beans via JNDI and
* then invoke on them
*
* @author Jaikiran Pai
*/
public class RemoteEJBClient {
public static void main(String[] args) throws Exception {
// Invoke a stateless bean
invokeStatelessBean();
// Invoke a stateful bean
// invokeStatefulBean();
}
/**
* Looks up a stateless bean and invokes on it
*
* @throws NamingException
*/
private static void invokeStatelessBean() throws NamingException {
// Let's lookup the remote stateless calculator
final RemoteCalculator statelessRemoteCalculator = lookupRemoteStatelessCalculator();
System.out
.println("Obtained a remote stateless calculator for invocation");
// invoke on the remote calculator
int a = 204;
int b = 340;
System.out
.println("Adding "
+ a
+ " and "
+ b
+ " via the remote stateless calculator deployed on the server");
int sum = statelessRemoteCalculator.add(a, b);
System.out.println("Remote calculator returned sum = " + sum);
if (sum != a + b) {
throw new RuntimeException(
"Remote stateless calculator returned an incorrect sum "
+ sum + " ,expected sum was " + (a + b));
}
// try one more invocation, this time for subtraction
int num1 = 3434;
int num2 = 2332;
System.out
.println("Subtracting "
+ num2
+ " from "
+ num1
+ " via the remote stateless calculator deployed on the server");
int difference = statelessRemoteCalculator.subtract(num1, num2);
System.out.println("Remote calculator returned difference = "
+ difference);
if (difference != num1 - num2) {
throw new RuntimeException(
"Remote stateless calculator returned an incorrect difference "
+ difference + " ,expected difference was "
+ (num1 - num2));
}
}
/**
* Looks up a stateful bean and invokes on it
*
* @throws NamingException
*/
private static void invokeStatefulBean() throws NamingException {
// Let's lookup the remote stateful counter
final RemoteCounter statefulRemoteCounter = lookupRemoteStatefulCounter();
System.out.println("Obtained a remote stateful counter for invocation");
// invoke on the remote counter bean
final int NUM_TIMES = 5;
System.out.println("Counter will now be incremented " + NUM_TIMES
+ " times");
for (int i = 0; i < NUM_TIMES; i++) {
System.out.println("Incrementing counter");
statefulRemoteCounter.increment();
System.out.println("Count after increment is "
+ statefulRemoteCounter.getCount());
}
// now decrementing
System.out.println("Counter will now be decremented " + NUM_TIMES
+ " times");
for (int i = NUM_TIMES; i > 0; i--) {
System.out.println("Decrementing counter");
statefulRemoteCounter.decrement();
System.out.println("Count after decrement is "
+ statefulRemoteCounter.getCount());
}
}
/**
* Looks up and returns the proxy to remote stateless calculator bean
*
* @return
* @throws NamingException
*/
private static RemoteCalculator lookupRemoteStatelessCalculator()
throws NamingException {
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES,
"org.jboss.ejb.client.naming");
/*
* remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=
* false
*
* remote.connections=default
*
* remote.connection.default.host=localhost
* remote.connection.default.port = 4447
* remote.connection.default.connect
* .options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
*/
jndiProperties
.put("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED",
false);
jndiProperties.put("remote.connections", "default");
jndiProperties.put("remote.connection.default.host", "localhost");
jndiProperties.put("remote.connection.default.port", "4447");
jndiProperties.put("remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS",false);
final Context context = new InitialContext(jndiProperties);
// The JNDI lookup name for a stateless session bean has the syntax of:
// ejb:<appName>/<moduleName>/<distinctName>/<beanName>!<viewClassName>
//
// <appName> The application name is the name of the EAR that the EJB is
// deployed in
// (without the .ear). If the EJB JAR is not deployed in an EAR then
// this is
// blank. The app name can also be specified in the EAR's
// application.xml
//
// <moduleName> By the default the module name is the name of the EJB
// JAR file (without the
// .jar suffix). The module name might be overridden in the ejb-jar.xml
//
// <distinctName> : AS7 allows each deployment to have an (optional)
// distinct name.
// This example does not use this so leave it blank.
//
// <beanName> : The name of the session been to be invoked.
//
// <viewClassName>: The fully qualified classname of the remote
// interface. Must include
// the whole package name.
// let's do the lookup
return (RemoteCalculator) context
.lookup("java:global/ejb-remote/CalculatorBean!org.jboss.as.quickstarts.ejb.remote.stateless.RemoteCalculator");
}
/**
* Looks up and returns the proxy to remote stateful counter bean
*
* @return
* @throws NamingException
*/
private static RemoteCounter lookupRemoteStatefulCounter()
throws NamingException {
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES,
"org.jboss.ejb.client.naming");
final Context context = new InitialContext(jndiProperties);
// The JNDI lookup name for a stateful session bean has the syntax of:
// ejb:<appName>/<moduleName>/<distinctName>/<beanName>!<viewClassName>?stateful
//
// <appName> The application name is the name of the EAR that the EJB is
// deployed in
// (without the .ear). If the EJB JAR is not deployed in an EAR then
// this is
// blank. The app name can also be specified in the EAR's
// application.xml
//
// <moduleName> By the default the module name is the name of the EJB
// JAR file (without the
// .jar suffix). The module name might be overridden in the ejb-jar.xml
//
// <distinctName> : AS7 allows each deployment to have an (optional)
// distinct name.
// This example does not use this so leave it blank.
//
// <beanName> : The name of the session been to be invoked.
//
// <viewClassName>: The fully qualified classname of the remote
// interface. Must include
// the whole package name.
// let's do the lookup
return (RemoteCounter) context
.lookup("ejb:/jboss-ejb-remote-server-side/CounterBean!"
+ RemoteCounter.class.getName() + "?stateful");
}
}
jboss-ejb-client.properties
#
# JBoss, Home of Professional Open Source
# Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual
# contributors by the @authors tag. See the copyright.txt in the
# distribution for a full listing of individual contributors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=localhost
remote.connection.default.port = 4447
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
running pom.xml, is also full of errors. which probably is saying that jboss provided pom.xml will not work also
[ERROR] Non-resolvable import POM: Failure to find org.jboss.spec:jboss-javaee-6.0:pom:3.0.2.Final-redhat-4 in http://repo.maven.apache . org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or update s are forced @ line 72, column 22 -> [Help 2] [ERROR] Non-resolvable import POM: Failure to find org.jboss.as:jboss-as-ejb-client-bom:pom:7.2.1.Final-redhat-10 in http://repo.maven.a pache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced @ line 80, column 22 -> [Help 2] [ERROR] 'dependencies.dependency.version' for org.jboss.spec.javax.transaction:jboss-transaction-api_1.1_spec:jar is missing. @ line 94, column 19 [ERROR] 'dependencies.dependency.version' for org.jboss.spec.javax.ejb:jboss-ejb-api_3.1_spec:jar is missing. @ line 102, column 19 [ERROR] 'dependencies.dependency.version' for org.jboss:jboss-ejb-client:jar is missing. @ line 118, column 20 [ERROR] 'dependencies.dependency.version' for org.jboss.xnio:xnio-api:jar is missing. @ line 125, column 20 [ERROR] 'dependencies.dependency.version' for org.jboss.xnio:xnio-nio:jar is missing. @ line 131, column 20 [ERROR] 'dependencies.dependency.version' for org.jboss.remoting3:jboss-remoting:jar is missing. @ line 138, column 20 [ERROR] 'dependencies.dependency.version' for org.jboss.sasl:jboss-sasl:jar is missing. @ line 145, column 21 [ERROR] 'dependencies.dependency.version' for org.jboss.marshalling:jboss-marshalling-river:jar is missing. @ line 152, column 21 [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException [ERROR] [Help 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException
1条答案
按热度按时间mwyxok5s1#
您的EJB客户端是独立的java客户端,因此,为了连接到JNDI服务并查找ejb引用,您需要为InitialContext对象提供一些配置。
异常是告诉您未提供此配置,因此无法创建InitialContext示例。
在这里你可以看到(一般来说)如何设置InitialConext属性。请记住,此配置是依赖于供应商的。
搜索教程,我可以看到一个file,似乎包含适合本教程的属性。我似乎是,这个文件是不可用的RemoteEJBClient.java类。