tomcat - 无法调用远程 EJB : no generator provided

标签 tomcat grails glassfish ejb

我在 Tomcat 上的 grails 应用程序试图调用 GlassFish 上的远程 EJB

RemoteService.groovy

class RemoteService {

    static transactional = false

    static Bin bin;

    public ICallCenter getAction() throws NamingException {

        if (bin == null) {
            bin = new Bin("127.0.0.1","3700") // local!
        }

        try{
            return (IMyInterface)((bin.getInitialContext()).lookup("java:global/My-ear/My-ejb-1.0/MyBean"))
        } catch (java.rmi.MarshalException e){
            ...
        }
    }

}

Bin.java

public class Bin {

    private Properties props = new Properties();

    public Bin(String host, String port) {
        props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
        props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
        props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
        props.setProperty("org.omg.CORBA.ORBInitialHost", host);
        props.setProperty("org.omg.CORBA.ORBInitialPort", port);

    }

    public InitialContext getInitialContext() throws NamingException {
        return new InitialContext(props);
    }

}

但它失败了,但有一个异常(exception):

javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory [Root exception is java.lang.IllegalStateException: No generator was provided and there is no default generator registered]
        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:674)
        at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
        at javax.naming.InitialContext.init(InitialContext.java:242)
        at javax.naming.InitialContext.<init>(InitialContext.java:216)
        at my.pckg.web.service.Bin.getInitialContext(Bin.java:21)
        at my.pckg.web.service.RemoteService.getAction(RemoteService.groovy:42)
        at my.pckg.web.SecuredBaseController.isWorkSessionActive(SecuredBaseController.groovy:34)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalStateException: No generator was provided and there is no default generator registered
        at org.glassfish.hk2.internal.ServiceLocatorFactoryImpl.internalCreate(ServiceLocatorFactoryImpl.java:226)
        at org.glassfish.hk2.internal.ServiceLocatorFactoryImpl.create(ServiceLocatorFactoryImpl.java:202)
        at org.glassfish.hk2.internal.ServiceLocatorFactoryImpl.create(ServiceLocatorFactoryImpl.java:187)
        at com.sun.enterprise.module.common_impl.AbstractModulesRegistryImpl.newServiceLocator(AbstractModulesRegistryImpl.java:142)
        at com.sun.enterprise.module.common_impl.AbstractModulesRegistryImpl.createServiceLocator(AbstractModulesRegistryImpl.java:218)
        at com.sun.enterprise.module.common_impl.AbstractModulesRegistryImpl.createServiceLocator(AbstractModulesRegistryImpl.java:224)
        at com.sun.enterprise.module.single.StaticModulesRegistry.createServiceLocator(StaticModulesRegistry.java:91)
        at org.glassfish.internal.api.Globals.getStaticHabitat(Globals.java:102)
        at com.sun.enterprise.naming.impl.SerialInitContextFactory.<init>(SerialInitContextFactory.java:130)
        at com.sun.enterprise.naming.SerialInitContextFactory.<init>(SerialInitContextFactory.java:62)
        at java.lang.Class.newInstance(Class.java:379)
        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:671)
        ... 9 more

根据问题Error while using jersey-client in osgi - No generator was provided ,我复制了hk2-api.jar,hk2-locator.jar,hk2-utils.jar,javax-inject.jar , jersey-guava-2.6.jar 到 tomcat/lib。但这没有帮助。 怎么了?

更新: 在 glassfish(位于同一主机)端,我们有

@Remote
public interface IMyInterface {
    ...
}

@Remote(IMyInterface .class)
@TransactionManagement(TransactionManagementType.BEAN)
@Stateless(mappedName = "MyBean")
public class MyBean implements IMyInterface {
    ....    
}

最佳答案

缺少 IntialContext 类,您应该在使用 初始化 Bin 时在 Bin.java 中尝试这个>主机、端口

  props.setProperty("org.omg.CORBA.ORBInitialHost", "127.0.0.1");
  props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
  InitialContext ctx = new InitialContext(props);
  SimpleBean bean = (SimpleBean) ctx.lookup(SimpleBean.class.getName());
  String result = bean.sayHello("Daniel Suarez Jabonete");
  oPrintWriter.println(result);

关于tomcat - 无法调用远程 EJB : no generator provided,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29792205/

相关文章:

Tomcat 看不到新文件

jsp - Tomcat 7 无法在 Ubuntu 14.04 中与 Eclipse Luna 一起使用

validation - 是否可以在 Grails 之外使用 Grails 验证?如何?

Java bean 服务器未正常运行

hibernate - 如何在 Tomcat 和 Glassfish 上使用相同的连接数据源?

JavaMelody - 在 GlassFish v3+ 中监控 sql 请求和 jdbc 连接

java - Spring Boot @Scheduled 不起作用

java - 在 Tomcat 中重新部署应用程序时发生内存泄漏

grails - 在使用Groovy/grails中的soap服务的同时处理具有多个字段数据的有效负载?

grails - 链接 Grails 插件?