【问题标题】:Using stateful bean in EJB using Client使用客户端在 EJB 中使用有状态 bean
【发布时间】:2014-01-17 05:13:42
【问题描述】:

我正在致力于在 Eclipse 中使用 EJB 和 JBOSS7.1 实现有状态会话的项目。

我在运行客户端代码时遇到了一个异常

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(NamingManager.java:645)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at com.sridhar.client.ShoppingCartClient.main(ShoppingCartClient.java:15)

这里有什么问题?

下面是我的代码,

界面:

package com.sridhar.shoppingcart;

import java.util.HashMap;

import javax.ejb.Remote;
import javax.ejb.Remove;

@Remote
public interface ShoppingCartLocal {
    void buy(String product,int quantity);
    HashMap<String,Integer> getCartContents();
    @Remove void checkOut();
}

实现业务逻辑的 Bean

package com.sridhar.shoppingcart;

import java.util.HashMap;
import java.util.Map;

import javax.ejb.Remote;
import javax.ejb.Stateful;


/**
 * Session Bean implementation class ShoppingCart
 */
@Stateful
@Remote(ShoppingCart.class)
public class ShoppingCart implements ShoppingCartLocal {

    private Map<String,Integer> cart = new HashMap<String,Integer>();
    /**
     * Default constructor. 
     */
    @Override
    public void buy(String product, int quantity) {
        // TODO Auto-generated method stub
        if(cart.containsKey(product)){
            int currentQuantity = cart.get(product);
            currentQuantity = currentQuantity+quantity;
            cart.put(product, currentQuantity); 
        }else{
            cart.put(product, quantity);
        }

    }

    @Override
    public HashMap<String, Integer> getCartContents() {
        // TODO Auto-generated method stub
        return (HashMap<String, Integer>) cart;
    }

    @Override
    public void checkOut() {
        // TODO Auto-generated method stub
        System.out.println("To be implemented");
    }
}

用于访问和查找代码的客户端代码:

package com.sridhar.client;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import java.util.*;

import com.sridhar.shoppingcart.ShoppingCartLocal;
public class ShoppingCartClient {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            InitialContext context = new InitialContext();
            ShoppingCartLocal cart = (ShoppingCartLocal)context.lookup("ShoppingCart/Remote");
            System.out.println("Buying 1 memory stick");
            cart.buy("Memory Stick",1);
            System.out.println("Buying another memory stick");
            cart.buy("Memory stick", 1);
            System.out.println("Buying 1 laptop");
            cart.buy("Lappy", 1);
            HashMap<String,Integer>fullCart = cart.getCartContents();
            for(String product : fullCart.keySet()){
                System.out.println("full cart is:"+product+","+fullCart.get(product));
            }
            System.out.println("checkOut");
            //cart.checkOut();
        } catch (NamingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

有什么好的方法可以很好的运行这个项目吗,然后给出实现的步骤。

为什么会出现异常?如何解决?

【问题讨论】:

    标签: java jakarta-ee jboss ejb


    【解决方案1】:

    您必须像这样通过 environment 实例化 InitialContext

    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY,CONTEXT_FACTORY_CLASS);    
    Context ctx = new InitialContext(env);
    

    这是在客户端应用程序中初始化上下文所必需的。请参考 InitialContext 的documentation 了解更多信息。希望这会有所帮助!

    【讨论】:

    • CONTEXT_FACTORY_CLASS 不是已解析的字段或常量,我必须提供 Context.Applet 吗?
    • 是的,可以用来指定小程序。请转至 Context 文档并查看。我的回答显示了如何初始化 InitialContext
    【解决方案2】:

    使用JNDI进行远程EJB调用时,需要注意以下几点:

    1)在客户端CLASSPATH中添加必要的依赖,即:添加远程接口类和jboss-client.jar。

    2) 正确实例化 InitialConetxt

    3) 提供正确的查找名称,(此信息在部署 ejb 时记录在服务器中)。

    您必须使用JBoss 7 requeriments(与以前的版本不同)才能正确配置客户端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多