Я создаю библиотеку классов java и модуль EJB в качестве приложения для аутентификации пользователя, которое может использоваться автономными клиентами, вызывая EJB удаленного интерфейса и его класс реализации (сессионный компонент). Я использую 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 и заполните его классом реализации (сессионный компонент) и методами dao 3) Добавьте оба указанных выше проекта в библиотеку клиентского JSF веб-приложение 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) Управляемый компонент в клиентском приложении:
@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. Я использую самую последнюю версию, поэтому надеюсь, что это не ошибка, и я просто неправильно ее настроил.
Также я не понимаю, нужно ли мне по-прежнему добавлять какие-либо конфигурации для EJB в файл конфигурации glassfish-web.xml (или sun-web.xml). Я предположил, что аннотаций Java EE достаточно.
Наконец, я должен сказать, что закодировал это вручную. Я не уверен, что использование мастеров Netbeans для создания библиотек и сессионных компонентов является лучшим способом убедиться в правильности конфигураций.
Был бы очень признателен за любые советы или отзывы, и, пожалуйста, дайте мне знать, если мне нужно предоставить дополнительную информацию. Заранее спасибо!