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