Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Web services 如何从grails独立客户端访问EJB服务_Web Services_Ejb_Grails 2.0 - Fatal编程技术网

Web services 如何从grails独立客户端访问EJB服务

Web services 如何从grails独立客户端访问EJB服务,web-services,ejb,grails-2.0,Web Services,Ejb,Grails 2.0,我在Grails2.0.3上开发的独立客户端访问EJB服务时遇到问题。EJB服务部署在glassfish服务器(Java)上。我在netbeans tester类上测试了此代码以访问EJB: Properties p = new Properties(); p.put("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory"); p.setProperty("ja

我在Grails2.0.3上开发的独立客户端访问EJB服务时遇到问题。EJB服务部署在glassfish服务器(Java)上。我在netbeans tester类上测试了此代码以访问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\u SERVICE\u JNDI
是一个包含已部署服务路径的变量,在本例中类似于
“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 jar(lib和模块),以便它可以进行
InitialContext()
调用,但现在我不确定这是否仍然是一个jar问题或配置问题,或者是什么问题

我知道当您尝试在java中分配不兼容的类型时会发生
IllegalArgumentException
,但我没有设置类似的设置,所以我假设这是一个内部方法初始化

所以问题是为什么会出现这个例外


是否有另一种从grails调用my services的方法更有效???

错误在于您试图使用grails中的tomcat插件(使用命令grails run app)运行web应用程序。问题是,当您尝试创建InitialContext(
com.sun.enterprise.naming.SerialInitContextFactory
)时,如果您使用GF 3.1的客户端库,groovy会为您强制转换某些类型时出错。(我知道这是个问题,但我真的不知道原因。因为理论上这应该行得通)

如果生成.war文件并在AppServer中部署,则可以毫无问题地连接到EJB。如果您将其部署在另一个GF服务器上,则不必导入任何客户端JAR

这将在生产环境中完美地工作,唯一的问题是你必须在GF服务器上编译和部署你的应用程序,每做一点小改动,这在开发过程中有点烦人

如果您想在GF之外工作并使用命令“
grails run app
”,则必须在远程服务器上修改.jar GF 3.1中的两个,其中您有grails应用程序:

1-jar文件$GLASSFISH_HOME/modules/GLASSFISH-corba-omgapi.jar

您应该在web中搜索类
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插件使用的类冲突

附言: 如果不想在grails应用程序中使用GF客户机JAR,可以向客户机的类路径中添加以下库

$GLASSFISH_HOME/modules/ejb-container.jar
$GLASSFISH_HOME/modules/ejb.security.jar
$GLASSFISH_HOME/modules/management-api.jar
如果将grails控制台与grails run app命令一起使用,则必须修改配置文件$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