簡體   English   中英

使用托管屬性時無法實例化類

[英]Cant instantiate class when using managed property

我正在學習Java 6 EE,並且有一個簡單的Web應用程序。

我有使用CurrencyManager類的UserBean類。 CurrencyManager是應用程序范圍的,並且是托管bean。 UserBean是受管bean,並且具有會話作用域。

這是我的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;
    }
}

我發布的代碼按原樣工作正常。 但是我不想在UserBean類中實例化CurrencyManager這就是為什么我將其設置為ApplicationScoped,因為它應該一直可用。

如果刪除實例化( UserBean構造函數的第一行)並將聲明更改為:

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

然后查詢UserBean ownedMoney屬性的第一頁將引發javax.servlet.ServletException: Cant instantiate class: model.UserBean. NullPointerException根本原因有關。 GlassFish日志顯示,當我在currencyManager上調用getCurrency時,在UserBean構造函數中發生了NullPtr:

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

你能告訴我我做錯了嗎?

我只是遇到了同樣的問題,並且偶然發現,如果我嘗試使用firefox(實際上是Linux下的icedove),它是行不通的,但是如果我嘗試使用eclipse內置瀏覽器,它將很好地工作。

即使這樣,這對我來說也沒有意義,您是否已經嘗試過使用其他瀏覽器?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM