2014-10-26 39 views
0

我創建一個Java類庫和EJB模塊,可以通過調用遠程接口EJB和它的實現類(會話bean)用於通過獨立客戶端用戶身份驗證的應用程序。我使用Netbeans 8和Glassfish 4.0。試圖運行它時,成功地構建應用程序,我得到了下面的堆棧後:爲JSF EJB應用正確的配置使用遠程接口

SEVERE: Exception during lifecycle processing 
java.lang.Exception: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Lcom/manaar/security/services/remote/UserServiceRemote; 
at com.sun.enterprise.web.WebApplication.start(WebApplication.java:168) 
at org.glassfish.internal.data.EngineRef.start(EngineRef.java:122) 
at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:291) 
at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:352) 
... 

SEVERE: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Lcom/manaar/security/services/remote/UserServiceRemote; 

我下面的步驟是:

1)創建Java類庫,並與遠程接口填充它,實體類 2)創建EJB模塊,並實現類(會話bean填充此)和DAO方法 3)添加兩個項目以上的客戶端JSF Web應用程序 4)調用遠程接口在EJB的圖書館客戶端應用程序並使用這些方法來顯示用戶配置文件

主要類別是: 1)Java類庫

@Remote 
public interface UserServiceRemote { 
public List<Users> findAllUsers(); 
public Users findByName(String userName); 
public void createUser(Users newUser); 
public void updateUser(Users updatedUsers); 
public void deleteUser(Users userToDelete); 
public void adminUpdateUser(Users aUpdatedUser); 


@Entity 
@Table(name = "SHA_USERS") 
public class Users { 

    @Id 
private String userName; 
private String password; 

2)EJB模塊

@Stateless 
public class UserServiceImpl implements UserServiceRemote { 

@EJB 
private UsersDao dao; 

@Override 
public Users findByName(String userName) { 
    return dao.findByName(userName); 
} 

3)Java類庫和EJB模塊都在客戶端應用程序添加作爲項目

4)在客戶端應用程序的管理的Bean:

@ManagedBean 
@SessionScoped 
public class SecClientFull { 

@EJB 
private UserServiceRemote useServ; 

private Users loggedUser; 
private String userName; 

public String showProfile() { 
    loggedUser = useServ.findByName(userName); 
    return "/Users/AppUserProfile"; 

} 

public String getUserName() { 
    userName = FacesContext.getCurrentInstance().getExternalContext().getRemoteUser(); 
    return userName; 
} 
... 
} 

在這個論壇和其他地方在線我看過幾篇關於GF3 bug的文章。我使用最新版本,所以我希望這不是一個錯誤,我只是簡單地配置了這個錯誤。

而且我不清楚我是否還需要到GlassFish-web.xml中(或sun-web.xml中)配置文件中添加任何配置的EJB的。我假定Java EE註釋是足夠的。

最後,我應該說我手動編碼這一點。我不確定使用Netbeans嚮導來創建庫和會話bean是確保配置正確的更好方法。

真的很感激任何意見或反饋,請讓我知道如果我需要提供更多的信息。提前致謝!

回答

1

的解決了以上兩個方面:

1)確保兩個Java類庫和EJB模塊具有獨立「的lib」目錄中創建,如果他們要通過獨立的應用程序(它們在使用我的情況)。如果你正在創建用於同一應用的EJB(很多教程),很容易忽略這一點

2)實體類(Users)必須實現java.io.Serialization接口,豆在客戶端

當第一次重新創建Java類庫和EJB模塊我得到的用戶不能強制轉換爲序列化一個ClassCastException。正如Java EE教程所說,當EJB模塊被獨立應用程序使用並跨網絡傳輸時,序列化的實現出於安全原因。

所以我在客戶端添加了接口到實體類和託管bean。該例外被取消,現在應用程序運行完美。再次感謝!

0

您是否爲您的類創建了默認無參數構造函數?因爲我沒有在你的代碼中看到它。

+0

是的,我做過。我試圖壓縮代碼,但它在那裏,應用程序正在工作。非常感謝你! – 2014-10-27 16:53:41