2013-08-04 57 views
1

我工作的Glassfish的版本3,當我試圖編譯應用這個錯誤日誌出現在日誌文件中,的Java EE EJB 3.0批註

SEVERE: The annotation symbol defined in super-class is not compatible with Session ejb ManagerDaoImpl 

的註解是@Singleton@Stateless

是有沒有辦法解決這個問題?

+0

後的EJB有意義的代碼和完整的堆棧跟蹤。 –

回答

0

我們的bean是;

@Stateless 
@Singleton 
public class ManagerDaoImpl extends AbstractDAO<X> implements ManagerDAO { 

@EJB 
PersonDAO personDao; 
@PersistenceContext(unitName = "PoyrazPU") 
private EntityManager em; 

。 。 。

重度:在超類中定義的註釋符號不與會話EJB ManagerDaoImpl ++通過使用@LocalBean @Local(LocalFoo.class)解決,而不是@Singleton

我們的新bean是兼容;

@Stateless 
@LocalBean 
@Local(MAanagerDAO.class) 
public class ManagerDaoImpl extends AbstractDAO<X> implements ManagerDAO { 

@EJB 
PersonDAO personDao; 
@PersistenceContext(unitName = "PoyrazPU") 
private EntityManager em; 

問題是解決了,但有大約@Lock標註了新的問題。我得到這個錯誤,

重度:@Lock僅允許用於單會話bean

@Asynchronous 
@Lock() 
@AccessTimeout(-1) 
@Override 
public void doStuff(Mass mass) { 

    for (int i = 0; i < RETRY_COUNT; i++) { 
     notify(mass); 
     try { 
      Thread.sleep(TIME); 
     } catch (InterruptedException ex) { 
      BeanLogger.logError("Thread sleep threw exception while informing masses: ", new ThreadSleepException(ex)); 

     } 
    } 
} 
+0

你是否設法解決這個問題?怎麼樣? –

3

具有@Singleton註釋的bean由Java VM執行一個實例,而具有@Stateless的bean由Java VM執行多個實例。

如果你有公共的方法,你可以定義一個基類,像下一個:

public abstract class AbstractBean { 
    public void commonMethod() { 
     // do common operation 
    } 
} 

public interface LocalFoo { 
    public void foo(); 
} 

public interface RemoteFoo { 
    public void foo(); 
} 

@LocalBean 
@Local(LocalFoo.class) 
@Remote(RemoteFoo.class) 
@Stateless 
public class FooBean extends AbstractBean implements LocalFoo, RemoteFoo { 
    @Override 
    public void foo() { 
     // do something 
    } 
} 
+0

問題已解決,但有關於@Lock註釋的新問題。我得到這個錯誤, – Poyraz

+0

在你的bean中用'@ Singleton'改變'@ Stateless'註解。 –