Атрибут "@inject" остается нулевым - PullRequest
12 голосов
/ 14 апреля 2011

Я пытаюсь добавить сервис в мой бин, но это всегда null. Я получаю следующую ошибку: WELD-001000 Ошибка разрешения свойства userBean для базового значения NULL.

Некоторые фрагменты кода:

index.xhtml

<h:body>
    Hello from Facelets
    #{userBean.name}
</h:body>

userbean.java

package beans;

import Domain.User;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import service.UserService;

@Named
@SessionScoped
public class UserBean implements Serializable{
    @Inject UserService service;
    private User user;

    public UserBean(){
        this.user = service.find_user("foo");
    }

    public String getName(){
        return "bar";
    }
}

UserService.java

package service;

import Domain.User;
import javax.ejb.Stateless;
import javax.inject.Named;

@Named
@Stateless
public class UserService {
    public UserService(){}

    public User find_user(String name){
        return new User();
    }
}

Ответы [ 2 ]

8 голосов
/ 24 октября 2014

Другой альтернативой является использование аннотации метода @PostConstruct.

@SessionScoped
public class UserBean implements Serializable {
    @Inject UserService service;
    private User user;
    public UserBean() {

    }

   @PostConstruct
    void init(){
        this.user = service.findUser("kaas"); 
    }

  }

Чтение документы

8 голосов
/ 14 апреля 2011

Сообщение об ошибке может быть подсказкой о том, что JVM не смогла создать экземпляр UserBean.Следующее предположение является некоторым предположением и должно быть доказано:

Внедрение зависимости требует инжектора зависимости, инструмента, который вводит экземпляр UserService в UserBean.В вашем коде вы уже используете этот внедренный экземпляр при создании экземпляра bean-компонента: вы вызываете внедренный сервис в конструкторе.

Если , инжектор зависимостей начинает свою работу после bean создан, затем вызов службы внутри конструктора вызовет NullPointerException (потому что service все еще null в это время).Это стоит проверить, попытавшись на мгновение поймать NPE в конструкторе UserBean.Если вы поймете один - voilà - инжектор зависимостей начнет работать после создания компонента, и, как следствие, мы не сможем использовать внедренные сервисы во время создания класса (= в конструкторе)


Обходной путьидея: реализовать небольшой вспомогательный класс поставщика услуг - внутренний класс может работать:

public class UserBean implements Serializable {
    static class UserServiceProvider {
      @Inject static UserService service;
    }

    // ... 

    public UserBean() {
      this.user = UserServiceProvider.service.findUser("kaas"); 
    }

    // ...
}

Не проверено, но может работать - служба должна быть внедрена в классе поставщика до того, как вы будете использовать ее вконструктор бобов.

...