我正在尝试连接 WebSphere 7.0 上的 EJB 。 EJB需要javax.ejb.SessionContext
并从中读取Principal,因此我需要在调用它之前登录。
我在独立应用程序中使用以下代码:
import javax.naming.InitialContext;
import javax.security.auth.login.LoginContext;
import com.ibm.websphere.security.auth.WSSubject;
import com.ibm.websphere.security.auth.callback.WSCallbackHandlerImpl;
public static void main(String[] args) throws Exception {
InitialContext ic = new InitialContext(System.getProperties());
LoginContext lc = new LoginContext("WSLogin",
new WSCallbackHandlerImpl("myuser","mypass"));
lc.login();
WSSubject.setRunAsSubject(lc.getSubject());
SessionContext sessionContext=(SessionContext) ic.lookup(
"java:comp/env/sessionContext");
}
我已将条目添加到jmxremote.access
:
myuser readwrite
然而,我得到一个例外:
引起:javax.naming.ConfigurationException:名称空间访问器 对于java:名称空间尚未设置。可能的原因是 user在JNDI Context方法调用中指定了java:URL名称,但是 没有在J2EE客户端或服务器环境中运行。在 com.ibm.ws.naming.java.javaURLContextFactory.isNameSpaceAccessable(javaURLContextFactory.java:98) 在 com.ibm.ws.naming.urlbase.UrlContextFactory.getObjectInstance(UrlContextFactory.java:82) 在 javax.naming.spi.NamingManager.getURLObject(NamingManager.java:584) 在 javax.naming.spi.NamingManager.getURLContext(NamingManager.java:533) 在 javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:320) 在javax.naming.InitialContext.lookup(InitialContext.java:392)
我还应该做些什么,在错误消息中提及的'J2EE客户端环境'中运行我的代码?
答案 0 :(得分:0)
要使用java:comp
,您需要将客户端应用程序打包在.ear中并使用launchClient
。最终,这将使用-CCBootstrapHost / -CCBootstrapPort(或默认值)连接到目标服务器以查找EJB,因此您可以使用EJB瘦客户端并使用完全限定的EJB绑定名称(请参阅{ SystemOut.log中的{1}}消息。
答案 1 :(得分:0)
您需要使用WAS客户端运行时JAR。 WAS_HOME /应用服务器/运行时间。您将需要ORB和其他特定于服务的JAR。作为使用launchClient的替代方法,您可以手动指定您将在此处使用的上下文工厂:
InitialContext ic = new InitialContext(System.getProperties());
设置
java.naming.factory.initial的
变量(在你的系统环境中或在一个Properties对象中)到
com.ibm.websphere.naming.WsnInitialContextFactory`