Как вызвать интерфейс класса обслуживания в бине CDI - PullRequest
0 голосов
/ 16 октября 2019

Мы планируем изменить управляемые компоненты на компоненты CDI. Мы использовали приведенный ниже код для вызова класса Service в управляемом компоненте.

@ManagedProperty("#{userService}")
private UserService userService;  and setter method

Для компонента CDI я заменил @ManagedProperty на @inject, как показано ниже, и он вызывает следующее исключение.

@SessionScoped
@Named
public class LoginController implements Serializable {
   @Inject
   private UserService userService;

}

org.apache.webbeans.exception.WebBeansDeploymentException: Passivation capable beans must satisfy passivation capable dependencies. 

UserService - это простой интерфейс с нереализованными методами, а UserServiceImpl реализует интерфейс UserService. Пожалуйста, смотрите ниже:

public interface UserService {
 public List<User> getUserList();   
}

public class UserServiceImpl implements UserService {
  private UserDao userDao;

  public List<User> getUserList() {
        return userDao.getUserList();
 }
}

Пожалуйста, дайте мне знать, как вызывать интерфейс службы в бобах CDI?

1 Ответ

1 голос
/ 16 октября 2019

Чтение ответа BalusC на Интеграция Spring JSF: как внедрить компонент / сервис Spring в управляемый bean-компонент JSF? говорит мне, что предполагается, что ваш bean-компонент Spring userService должен быть внедрен в ваш bean-компонент Spring. Боб CDI LoginController.

Но ваш UserServiceImpl не Serializable, что в контексте CDI означает, что он не способен к пассивации .

Это также то, что говорит ваше Исключение.

Так что либо создайте свой LoginController @RequestScoped вместо @SessionScoped, чтобы самим себе и @Inject ed дочерним элементам не требовалась пассивация (иначе говоря Serializable). Или сделайте ваши UserServiceImpl и реализации DAO Serializable (что imho несколько странно?).

...