我正在创建一个 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 是否是确保配置正确的更好方法。
非常感谢任何建议或反馈,如果我需要提供更多信息,请告诉我。提前致谢!