繁体   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