18 Ekim 2021 Pazartesi

Jakarta EE @Local Anotasyonu

Giriş
Eski kodlarda şu satırı dahil ederiz.
import javax.ejb.Local;
Şu satırı dahil ederiz
import jakarta.ejb.Local;
Belirtilen arayüzü JNDI üzerinden dışarıya açar. EJB türlerinin açıklaması şöyle. @Local anotasyonu Local Client View'a denk gelir.
- Local Client View: İstemcinin aynı JVM üzerinde koşması.
- Remote Client View: İstemcinin farklı bir JVM üzerinde koşması. Uygulamamız bunun üzerine olacak.
- No-Interface View: Local gibi istemci aynı JVM’de koşar fakat farklı olarak istemci ile EJB aynı projede olmak zorundadır. İstemci Local Client View’da farklı projelerde farklı EAR’larla deploy edilmiş bir EJB’yi aynı JVM’de koşmak şartıyla çağırabiliyorken, No-Interface’de farklı projede bulunamaz.
Transaction Özelliği
Açıklaması şöyle
If the transaction attribute type is not specified, it is assumed to be REQUIRED. The absence of a transaction attribute specification on the bean class is equivalent to the specification of TransactionAttribute(REQUIRED) on the bean class.
Yani eğer EJB'nin transaction özelliğini belirmezsek sınıf şöyle kabul edilir
@TransactionManagement(TransactionManagementType.CONTAINER)
Metodları ise  şöyle kabul edilir
@TransactionAttribute(TransactionAttributeType.REQUIRED)
Örnek
Şöyle yaparız
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class MyServiceBean  {...}
@Local Anotasyonu
Örnek
Eski kodlarda @Local arayüz üzerine yazılırdı.
@Stateless
public class MyEJB implements MyEJBLocal {
  public void myBusinessMethod() {
    //Implementation
  }
}

@Local
public interface MyEJBLocal {
  public void myBusinessMethod();
}
Ancak sınıfımız sadece tek arayüzden kalıtıyorsa bu gerekli değil. Açıklaması şöyle
Use of the Local annotation is only required when the bean class does not implement only a single interface other than any of the following: java.io.Serializable; java.io.Externalizable; any of the interfaces defined in javax.ejb.
Yani şöyle yazsak bile
public interface MyBeanIntf { void doStuff(); }

@Stateless
public class MyBean implements MyBeanIntf { public void doStuff(){ } }
Bu aslında şu kod gibi kabul edilebilir
@Local
public interface MyBeanIntf { void doStuff(); }

@Stateless
public class MyBean implements MyBeanIntf { public void doStuff(){ } }
Aslında @Local anotasyonunu kullanınca JNDI ismi de değişiyor. Şu hale geliyor
java:app/mymodule/FooBean //@Stateless için
java:app/mymodule/MyBean!com.foo.bar.MyBeanIntf @Local için






Hiç yorum yok:

Yorum Gönder