2013-05-13 1 views
1

Пытались запустить мой первый проект EJB на пару дней. Мой проект EJB в настоящее время имеет этот исходный код:Каков правильный способ поиска EJB-компонента?

package calc; 
import javax.ejb.Remote; 
@Remote 
public interface SessionBeanRemote { 
public int add(int a,int b); 
} 

package calc; 
import javax.ejb.Stateless; 
@Stateless(name="MySessionBean",mappedName="myCalculator") 
public class SessionBean implements SessionBeanRemote { 
public int add(int a,int b){ 
    return a +b; 
} 
} 

Во-вторых, Есть еще один простой Java проект, в котором я могу назвать EJB компонент:

Properties props = new Properties(); 
props.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.enterprise.naming. 
SerialInitContextFactory"); 
props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost"); 
props.setProperty("org.omg.CORBA.ORBInitialPort", "3700"); 
InitialContext ctx = new InitialContext(props); 
SessionBeanRemote bean = (SessionBeanRemote) ctx.lookup("myCalculator"); 
int result = bean.add(3, 4); 
System.out.println(result); 
ctx.close(); 

JAR используется: гс-client.jar, нет необходимости добавлять другие, как Glassfish JAR-сообщества оценили

Пойманное:

java.lang.NoSuchMethodError: com.sun.corba.ee.spi.orbutil.fsm.FSMImpl.(Lcom/sun/corba/ee/spi/orbutil/fsm/StateEngine;Lcom/sun/corba/ee/spi/orbutil/fsm/State;Z)V

2 OT ее вопросы:

  1. context.lookup("java:global:/componentAddress") против context.loopup("mappedName") чем разница между ними, когда использовать каждый?

  2. props.setProperty("org.omg.CORBA.ORBInitialHost", "192.168.1.100") против props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost")

+0

Существует довольно много дискуссий по этому вопросу. Вы должны будете найти свой ответ: http://valery-lavrov.com/blog/2012/05/15/glassfish-3-ejb-3-1-and-standalone-client/ –

+0

@SamiKorhonen Я боюсь, все равно получите java.lang.NoSuchMethodError – Rehme

+0

И вы используете appserv-rt.jar в соответствии с инструкциями? –

ответ

0

Просто проблема сводилась к GlassFish версии 3.0, Скачал последнюю версию 3.1.2 и все работает великолепно.

0

Я обзор и ответить на ваши вопросы:

  • Использование mappedName является продуктом конкретного, означает, что она не гарантирована работать и контейнеры не обязаны выполнять его, но name в отличии является должен.
  • вы можете аннотировать это следующим образом: @Stateless(name="myCalculator", description="This EJB does some complex calculations.") то вы можете использовать Context.lookup() в коде: Context context = new InitialContext(); MyCalculatorRemote bean = (MyCalculatorRemote) context.lookup("java:global/mycalculator-ejb/myCalculator!example.domain.calculator.MyCalculatorRemote");
  • этот пример предполагает, что ваш проект назван «MyCalculator-EJB» после рекомендуемого именования-конвенции, this link также показывает подробнее об этом.
  • , что вы должны добавить код здесь, чтобы сделать это на самом деле работает

Ответ 1): java:global/project-ejb/someBean!example.domain.project.SomeRemote переносим в то время как отображается название не означает 1-ый работает на любом контейнере и второй делает, может быть, нет. Взгляните here на официальную документацию.

Ответ на 2): сначала с IP-адресом, который сохранит ваш DNS-поиск, 2-е место с именем хоста, которое здесь является значением по умолчанию().

Надеюсь, это ответит на некоторые вопросы, даже спустя 4 года.