2014-01-17 6 views
0

Я работаю над проектом для достижения сеанса с использованием состояния с использованием EJB и JBOSS7.1 в eclipse.Использование компонента stateful bean в EJB с использованием клиента

я придумал исключение во время выполнения кода клиента как

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(); 
} 

Бин, который реализует бизнес-логику кода

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(); 
     } 
    } 

} 

Есть ли хороший способ запустить этот проект ?, затем дать шаги для достижения.

Почему возникает исключение? как его решить?

ответ

1

Вы должны создать экземпляр InitialContext прохождения environment как этот

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

Это необходимо для инициализации контекста в клиентских приложениях. Пожалуйста, обратитесь к documentation из InitialContext, чтобы узнать больше. Надеюсь это поможет!

+0

CONTEXT_FACTORY_CLASS не является разрешенным полем или константой, должен ли я предоставить Context.Applet? –

+0

Да, вы можете использовать для указания апплета. Перейдите в Контекстную документацию и проверьте. Мой ответ показывает, как инициализировать InitialContext – Keerthivasan

0

При выполнении удаленного EJB вызова с помощью JNDI, вы должны обратить внимание на эти пункты:

1) добавить в клиентский CLASSPATH необходимые dependecis, это: добавить класс удаленного интерфейса и jboss- client.jar.

2) экземпляр InitialConetxt правильно

3) обеспечивают правильное имя поиска, (эта информация записывается на сервере при развертывании EJB).

Вы должны выполнить с JBoss 7 requeriments (это не то же самое, что и предыдущие версии), чтобы правильно настроить клиента.

Смежные вопросы