Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > ejb3.0 application


Автор: mhalion 16.4.2009, 17:59
Создаю в eclipse "EJB Project", создаю простую табличку и entuity к ней:
Код

package ejbbase.entities;
...
@Entity
@Table(name="MYTEST")
@SequenceGenerator(allocationSize=1, initialValue=1, name="TEST_SEQUENCE", sequenceName="TEST_SEQ")
public class Mytest implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="TEST_SEQUENCE")
    @Column(nullable = false, unique = true, updatable = false, precision = 10, scale = 0)
    private int iid;
    @Column(nullable = false, unique = true)
    private String vle;
    @Column(nullable = false)
    private String dsc;
    private static final long serialVersionUID = 1L;

    public Mytest() { super(); }
    public int getUid() { return this.iid; }
    public void setUid(int uid) { this.iid = uid; }
    public String getVle() { кeturn this.vle; }
    public void setVle(String vle) { this.vle = vle; }
    public String getDsc() { return this.dsc; }
    public void setDsc(String dsc) { this.dsc = dsc; }
}

Создаю local и remote интерфейсы:
Код

package ejbbase.interfaces;
...
@Local
public interface ITestBeanLocal {
    public Mytest getByUid(int uid);
    public void add(String vle, String dsc);
    public void edit(int uid, String vle, String dsc);
    public void remove(int uid);
    public List<Mytest> getAll();
}
package ejbbase.interfaces;
...
@Remote
public interface ITestBeanRemote {
    public Mytest getByUid(int uid);
    public void add(String vle, String dsc);
    public void edit(int uid, String vle, String dsc);
    public void remove(int uid);
    public List<Mytest> getAll();
}

Делаю bean на этих интерфейсах:
Код

package ejbbase.beans;
...
@Stateless
public class TestBean implements ITestBeanLocal, ITestBeanRemove {
    @PersistenceContext(unitName = "ejbp")
    EntityManager em;
    public static final String RemoteJNDIName =  TestBean.class.getSimpleName() + "/remote";
    public static final String LocalJNDIName =  TestBean.class.getSimpleName() + "/local";
    @Override
    public Mytest getByUid(int uid) {...}
    @Override
    public void add(String vle, String dsc) {...}
    @Override
    public void edit(int uid, String vle, String dsc) {...}
    @Override
    public List<Mytest> getAll() {...}
    @Override
    public void remove(int uid) {...}
}

Т.е. всё это создаю в "EJB Porject".

Далее если мне нужно сделать веб-приложение, я создам, например, "Dinamic Web Project" и в сервлете буду работать Remote-интерфейсом.
Код

try {
            ITestBeanRemove tb = (ITestBeanRemove)new InitialContext().lookup(TestBean.RemoteJNDIName);
            if (request.getParameter("action").equals("add")) {
                tb.add(request.getParameter("value"), request.getParameter("desc"));                
            } else if (request.getParameter("action").equals("remove")) {
                tb.remove(Integer.parseInt(request.getParameter("uid")));
            } else if (request.getParameter("action").equals("edit")) {
                tb.edit(Integer.parseInt(request.getParameter("uid")),
                        request.getParameter("value"),
                        request.getParameter("desc"));
            } else if (request.getParameter("action").equals("all")) {
                List<Mytest> items = tb.getAll();
                for (Mytest t : items) {
                    System.out.println(t.getUid() + " > " + t.getVle() + " > " + t.getDsc());
                }
            }
        } catch (NamingException e) {
            e.printStackTrace();
        }

И т.д.

Но я не могу найти как использовать ejb в рамках обычного приложения!

Я использую jboss-5.0.1.GA.

Можно кинуть пример или ссылочку.

Автор: MisterCleric 17.4.2009, 09:11
Доброе утро. 
Да ты знаешь - точно также. Просто InitialContext нужно передать определенные свойтсва:
Код

  Hashtable env = new Hashtable();
        env.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); // если JBOSS
        env.put("java.naming.provider.url", "localhost:1099"); // если JBOSS и порты поумолчанию
        Context ctx = new InitialContext(env);
        ITestBeanRemove tb = (ITestBeanRemove) ctx.lookup(TestBean.RemoteJNDIName);


Только здесь два таких момента:
1. Твое клиентское приложение должно знать в своем CLASSPATH об ITestBeanRemove
2. TestBean.RemoteJNDIName не есть корректно. Так как придется еще в CLASSPATH клиентского приложения ложить еще и сам бин. Перенеси определения JNDI в интерфейсы

И еще такое: странно, что оно вообще с такими JNDI именами даже в сервлете работает. Я наблюдал такое, что если не указать
Код

@Stateless(mappedName = [твое желаемое JNDI имя])

то JBOSS его генерит как: имя ЕАР + / + имя класса Имплементации + /remote или /local
Под каким именем(именами) задеплоил этот бин у тебя? что пишет в консоли?

Автор: mhalion 20.4.2009, 08:53
"Под каким именем(именами) задеплоил этот бин у тебя? что пишет в консоли?".
Вот:
+- TestBean (class: org.jnp.interfaces.NamingContext)
  |   +- local (class: Proxy for: ejbbase.interfaces.ITestBeanLocal)
  |   +- remote-ejbbase.interfaces.ITestBeanRemove (class: Proxy for: ejbbase.interfaces.ITestBeanRemove)
  |   +- remote (class: Proxy for: ejbbase.interfaces.ITestBeanRemove)
  |   +- local-ejbbase.interfaces.ITestBeanLocal (class: Proxy for: ejbbase.interfaces.ITestBeanLocal)

Вот ещё вопрос:

Как правильно запустить проект как обычное приложение? Это должен сделать сам сервер с помощью каких-то листнеров?


Автор: xaoc2 30.4.2009, 00:11
Кстати,..... чтобы не дублировать код:

Код

package ejbbase.interfaces;
...
public interface ITest{
    public Mytest getByUid(int uid);
    public void add(String vle, String dsc);
    public void edit(int uid, String vle, String dsc);
    public void remove(int uid);
    public List<Mytest> getAll();
}

@Local
public interface ITestBeanLocal  extends ITest {}

.............
...
@Remote
public interface ITestBeanRemote extends ITest{}
....................
...................

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)