Правильная конфигурация для приложения JSF EJB с использованием удаленного интерфейса

Я создаю библиотеку классов 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 для создания библиотек и сессионных компонентов является лучшим способом убедиться в правильности конфигураций.

Был бы очень признателен за любые советы или отзывы, и, пожалуйста, дайте мне знать, если мне нужно предоставить дополнительную информацию. Заранее спасибо!


person jay tai    schedule 26.10.2014    source источник


Ответы (2)


Решение вышеизложенного двоякое:

1) Убедитесь, что и библиотека классов Java, и модуль EJB созданы с отдельными каталогами lib, если они используются автономными приложениями (каковыми они являются в моем случае). Этот момент легко упустить из виду, если вы создаете EJB для использования в одном приложении (как и многие учебные пособия).

2) Класс сущности (Пользователи) должен реализовывать интерфейс java.io.Serialization, как и управляемый компонент на стороне клиента.

При первом воссоздании библиотеки классов Java и модуля EJB я получил исключение ClassCastException, которое нельзя преобразовать в сериализацию пользователей. Как сказано в руководстве по Java EE, реализация сериализации осуществляется из соображений безопасности, когда модули EJB используются автономными приложениями и передаются по сетям.

Итак, я добавил интерфейс к классу сущности и управляемому компоненту на стороне клиента. Исключение было устранено, и теперь приложение работает отлично. Еще раз спасибо!

person jay tai    schedule 27.10.2014

Вы создали конструктор по умолчанию без аргументов для своего класса. Потому что я не вижу этого в вашем коде.

person njjnex    schedule 27.10.2014
comment
Да, я сделал. Я пытался сжать код, но он есть, и теперь приложение работает. Большое тебе спасибо! - person jay tai; 27.10.2014