Не могу создать экземпляр класса при использовании управляемого свойства

Я изучаю Java 6 EE, и у меня есть простое веб-приложение.

я имею UserBean класс, который использует CurrencyManager учебный класс. CurrencyManager является областью применения и является управляемым компонентом. UserBean Управляемый компонент и область действия сеанса.

Вот мой UserBean:

@ManagedBean
@SessionScoped
public class UserBean implements Serializable{
    private String username;
    private ArrayList<Money> ownedMoney;

    private CurrencyManager currencyManager;
    private BigDecimal credits;

    public UserBean() {
        currencyManager = new CurrencyManager();
        username = "User";
        ownedMoney = new ArrayList<>();
        ownedMoney.add(new Money(new BigDecimal(15000), currencyManager.getCurrency("CZK")));
        ownedMoney.add(new Money(new BigDecimal(100), currencyManager.getCurrency("USD")));
        credits = new BigDecimal(150);
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public BigDecimal getCredits() {
        return credits;
    }

    public void setCredits(BigDecimal credits) {
        this.credits = credits;
    }

    public ArrayList<Money> getOwnedMoney() {
        return ownedMoney;
    }

    public void setOwnedMoney(ArrayList<Money> ownedMoney) {
        this.ownedMoney = ownedMoney;
    }

    public CurrencyManager getCurrencyManager() {
        return currencyManager;
    }

    public void setCurrencyManager(CurrencyManager currencyManager) {
        this.currencyManager = currencyManager;
    }
}

И вот мой CurrencyManager:

@ManagedBean(name = "currencyManager")
@ApplicationScoped
public class CurrencyManager {
    private HashMap<String, Currency> currencies;

    public CurrencyManager() {
        this.currencies = new HashMap<>();
        currencies.put("CZK", new Currency("CZK", new BigDecimal("0.0503")));
        currencies.put("GBP", new Currency("GBP", new BigDecimal("0.59")));
        currencies.put("EUR", new Currency("EUR", new BigDecimal("1.38")));
        currencies.put("USD", new Currency("USD", new BigDecimal("1.0")));
    }

    public Currency getCurrency(String name){
        return currencies.get(name);
    }

    public java.util.Collection<Currency> getCurrencies() {
        return currencies.values();
    }

    public void setCurrencies(HashMap<String, Currency> currencies) {
        this.currencies = currencies;
    }
}

Код, который я разместил, работает нормально, как есть. Однако я не хочу создавать экземпляры CurrencyManager в моем UserBean класс - вот почему я сделал это ApplicationScoped, так как он должен быть доступен всегда.

Если я удаляю экземпляр (первая строка в UserBean конструктор) и измените объявление на:

@ManagedProperty(value = "#{currencyManager}")
private CurrencyManager currencyManager;

тогда первая страница, которая запрашивает ownedMoney недвижимость в UserBean бросает javax.servlet.ServletException: Cant instantiate class: model.UserBean. с коренной причиной NullPointerException, Журнал GlassFish показал, что NullPtr происходит в UserBean конструктор, когда я звоню getCurrency на currencyManager, Вот:

ownedMoney.add(new Money(new BigDecimal(15000), currencyManager.getCurrency("CZK")));

Можете ли вы сказать мне, что я делаю не так?

1 ответ

Я только что столкнулся с той же проблемой, и случайно обнаружил, что она не работает, если я пытаюсь с Firefox (на самом деле icedove под Linux), но хорошо работает, если я пытаюсь использовать встроенный браузер eclipse.

Несмотря на это, это не имеет смысла для меня, вы уже пробовали с другими браузерами?

Другие вопросы по тегам