Проблемы с инъекцией - PullRequest
       134

Проблемы с инъекцией

2 голосов
/ 03 августа 2020

У меня проблема, когда инъекция не срабатывает с первой попытки, но не со второй. Мое приложение устроено так (это приложение Java EE, использующее Maven в Eclipse):

@Stateful
@Named("myBean")
@SessionScoped

public class MyBean implements Serializable {

@Inject
private User user;
...

@PostConstruct
public String init() {
.. do some general tasks, no issues here.
}

public String initApplication() { // this gets called on page load
   String userId = user.getId(); 
...
}

....  in another class...

@Produces
@SessionScoped
@Named("user")
public User produceUser() {
  // code to create user is here
}

Симптом: я запускаю браузер, очищаю кеш, запускаю приложение. Я получаю ноль на user метод @Produces никогда не вызывается. Я снова вызываю тот же URL-адрес, чтобы запустить приложение, и оно работает.

1 Ответ

2 голосов
/ 09 августа 2020

Именованное внедрение может быть немного нестабильным на некоторых серверах EE при использовании в сочетании с @Produces. Не только это, но и фактически создает совершенно отдельный экземпляр с двусмысленностью. Поэтому, если у вас есть компонент User, определенный в области сеанса где-то еще, они считаются двумя разными источниками внедрения. Может быть, это то, что происходит, и он забирает второй при перезагрузке?

Что произойдет, если вы отойдете от @Produces (удалите produceUser()) и вместо этого сделаете;

@Named
@SessionScoped
public class User implements Serializable {
    @PostConstruct
    private init() {
        /* Do what you did in the producer method here */
    }
}

Это действительно должно сработать - иначе что-то серьезно не так.

...