2013-01-23 60 views
2

我一直有问题从我在grails 2.0.3上开发的独立客户端访问我的EJB服务。 EJB服务部署在Glassfish服务器(Java)上。我测试了一个NetBeans测试类的代码来访问EJB的:如何从grails独立客户端访问EJB服务

Properties p = new Properties(); 
    p.put("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory"); 
    p.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming"); 
    p.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl"); 
    p.setProperty("org.omg.CORBA.ORBInitialHost", INTEGRATION_IP); 
    p.setProperty("org.omg.CORBA.ORBInitialPort", CORBA_PORT); 
    ctx = new InitialContext(p); 
    try { 
     this.admAuth = (AdmAuthenticationRemote) this.ctx.lookup(Tester.AUTHENTICATION_SERVICE_JNDI); 
    }catch(Exception e){ 
     ... 
    } 

Tester.AUTHENTICATION_SERVICE_JNDI是一个变量THA包含路径部署的服务,在这种情况下,像"java:global/..."表示地址是服务被请求。这种访问服务的方式完全可以从测试程序中完成,但是当我尝试从grails执行相同的操作时不起作用。我能够创建上下文以同样的方式,但是当我调用ctx.lookup()呼叫我得到一个异常:

Message: Lookup failed for 'java:global/...' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory, 
java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} 
Cause: javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory, 
java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} 
[Root exception is java.lang.RuntimeException: Orb initialization erorr] 

主要的例外是命名异常,这意味着它在ctx.lookup()失败,但原因是orb初始化异常,它有另一个异常堆栈:

java.lang.RuntimeException: Orb initialization erorr 
Caused by: java.lang.RuntimeException: java.lang.IllegalArgumentException: Can not set long field com.sun.corba.ee.impl.orb.ORBDataParserImpl.waitForResponseTimeout to java.lang.Integer 
Caused by: java.lang.IllegalArgumentException: Can not set long field com.sun.corba.ee.impl.orb.ORBDataParserImpl.waitForResponseTimeout to java.lang.Integer 

我真的迷失在这里。我一直有很多问题需要通过grails来完成,我必须得到所有glassfish罐(库和模块),以便能够调用InitialContext(),但现在我不确定这是否仍然是jar问题或配置问题或它是什么。

我知道IllegalArgumentException发生在你尝试在java中分配不兼容的类型,但我没有设置类似的东西,所以我假设它的内部方法初始化。

所以问题是为什么这个例外即将到来?

是否有另一种方式来从grails调用我的服务更好?

回答

2

错误是,您正尝试在grails中使用tomcat插件运行您的web应用程序(使用命令grails run-app)。问题是,当您尝试创建InitialContext(com.sun.enterprise.naming.SerialInitContextFactory)时,如果您使用GF 3.1的客户端库,groovy会给您带来一些转换错误。 (我知道这是问题,但我真的不知道这个原因,因为理论上这应该起作用)

如果生成.war文件并在AppServer中部署,则可以连接到你的EJB没有问题。如果您将其部署到另一台GF服务器上,则无需导入任何客户端罐。

这将在生产中完美工作,唯一的问题是,您必须在GF服务器上编译和部署您的应用程序,并进行一些小改动,这在开发过程中有点烦人。

如果你想GF和使用命令“grails run-app”在外面工作,你必须在远程服务器上,在那里你有Grails应用程序上修改两个的.jar GF 3.1:

1-罐子文件$ GLASSFISH_HOME/modules/glassfish-corba-omgapi。罐子

你应该在网络搜索类com.sun.corba.ee.spi.orb.ParserImplBase,并修改这部分

Field field = getAnyField(name); 
    field.setAccessible(true); 
    field.set(ParserImplBase.this, value); 

if (name.equalsIgnoreCase("waitForResponseTimeout")) { 
    Object newValue = new Long(1800000); 
    Field field = getAnyField(name); 
    field.setAccessible(true); 
    field.set(ParserImplBase.this, newValue); 
} else { 
    Field field = getAnyField(name); 
    field.setAccessible(true); 
    field.set(ParserImplBase.this, value); 
} 

这应该解决的java.lang.IllegalArgumentException异常

2- jar文件$ GLASSFISH_HOME/modules/glassfish-corba-orb.jar

您必须删除javax.rmi.CORBA.PortableRemoteObjectClass类这个库的,因为这个类有一个使用的Grails的插件

PS冲突: 如果你不想在你的Grails应用程序的GF客户端罐子,你可以添加你的客户端机器的类路径以下库

$GLASSFISH_HOME/modules/ejb-container.jar 
$GLASSFISH_HOME/modules/ejb.security.jar 
$GLASSFISH_HOME/modules/management-api.jar 

如果您使用的Grails的Grails的控制台运行应用程序的命令,必须修改配置文件$ GRAILS_HOME/conf目录/ Groovy的starter.conf白衣这个

load $GLASSFISH_HOME/modules/ejb-container.jar 
    load $GLASSFISH_HOME/modules/ejb.security.jar 
    load $GLASSFISH_HOME/modules/management-api.jar 
+0

+1用于描述错误。 –

相关问题