0

我正在创建一个 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 是否是确保配置正确的更好方法。

非常感谢任何建议或反馈,如果我需要提供更多信息,请告诉我。提前致谢!

4

2 回答 2

1

解决上述问题的方法有两个:

1) 确保 Java 类库和 EJB 模块都是使用单独的“lib”目录创建的,如果它们要供独立应用程序使用(在我的情况下是这样)。如果您正在创建 EJB 以在同一个应用程序中使用,那么很容易忽略这一点(就像许多教程一样)

2)实体类(Users)必须实现java.io.Serialization接口,客户端的托管bean也应该实现

当第一次重新创建 Java 类库和 EJB 模块时,我得到了一个 ClassCastException,用户无法转换为序列化。正如 Java EE 教程所说,当 EJB 模块被独立应用程序使用并跨网络传输时,序列化的实现是出于安全原因。

所以我在客户端添加了实体类和托管bean的接口。异常已消除,应用程序现在可以完美运行。再次感谢!

于 2014-10-27T16:52:59.773 回答
0

您是否为您的类创建了默认的无参数构造函数。因为我在您的代码中没有看到它。

于 2014-10-27T16:36:25.003 回答