[英]Correct Configuration for JSF EJB application using remote interface
我正在創建一個Java類庫和EJB模塊作為用戶身份驗證應用程序,獨立的客戶端可以通過調用遠程接口EJB及其實現類(會話bean)來使用它。 我正在使用Netbeans 8和Glassfish 4.0。 成功構建應用程序后,嘗試運行該應用程序時,我得到以下堆棧:
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中的錯誤。 我使用的是最新版本,所以我希望這不是一個錯誤,我只是配置了這個錯誤。
另外,我不清楚我是否仍然需要在glassfish-web.xml(或sun-web.xml)配置文件中為EJB添加任何配置。 我假設Java EE注釋就足夠了。
最后我應該說我是手動編碼的。 我不確定使用Netbeans向導創建庫和會話bean是否是確保配置正確的更好方法。
非常感謝任何建議或反饋,請告訴我是否需要提供更多信息。 提前致謝!
上面的解決方案是雙重的:
1)如果要由獨立的應用程序使用(在我的情況下),請確保同時使用單獨的“ lib”目錄創建Java類庫和EJB模塊。 如果要創建要在同一應用程序中使用的EJB,那么很容易忽略這一點(與許多教程一樣)
2)實體類(用戶)必須實現java.io.Serialization接口,客戶端的托管Bean也應實現
第一次重新創建Java類庫和EJB模塊時,我收到一個ClassCastException,表明用戶不能轉換為序列化。 正如Java EE教程所述,當EJB模塊由獨立的應用程序使用並跨網絡傳輸時,出於安全原因,實現序列化是實現的。
因此,我將接口添加到了客戶端的實體類和托管bean中。 消除了異常,該應用程序現在可以完美運行。 再次感謝!
您是否為類創建了默認的無參數構造函數。 因為我在您的代碼中看不到它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.