簡體   English   中英

使用遠程接口正確配置JSF EJB應用程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM