gpt4 book ai didi

java - 使用远程接口(interface)正确配置 JSF EJB 应用程序

转载 作者:行者123 更新时间:2023-12-01 12:22:25 25 4
gpt4 key购买 nike

我正在创建一个java类库和EJB模块作为用户身份验证应用程序,独立客户端可以通过调用远程接口(interface)EJB及其实现类( session 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类库并用远程接口(interface)和实体类填充它2) 创建 EJB 模块并使用实现类( session bean)和 dao 方法填充该模块3) 将上面的两个项目添加到客户端 JSF Web 应用程序的库中4) 在客户端应用程序中将远程接口(interface)作为 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 向导创建库和 session Bean 是否是确保配置正确的更好方法。

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

最佳答案

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

1) 如果 Java 类库和 EJB 模块要由独立应用程序使用(在我的例子中就是这样),请确保使用单独的“lib”目录创建 Java 类库和 EJB 模块。如果您要创建在同一个应用程序中使用的 EJB(正如许多教程一样),则很容易忽视这一点

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

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

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

关于java - 使用远程接口(interface)正确配置 JSF EJB 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26578890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com