0

我正在学习 Java 6 EE,并且我有一个简单的网络应用程序。

我有UserBean使用类的CurrencyManager类。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;
    }
}

我发布的代码可以正常工作。但是我不想CurrencyManager在我的UserBean类中实例化 - 这就是我将它设为 ApplicationScoped 的原因,因为它应该始终可用。

如果我删除实例化(构造函数中的第一行UserBean)并将声明更改为:

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

ownedMoney然后查询属性的第一页UserBean抛出javax.servlet.ServletException: Cant instantiate class: model.UserBean.的根本原因为NullPointerException. GlassFish 日志显示 NullPtr 发生在UserBean构造函数中,当我getCurrencycurrencyManager这里调用时:

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

你能告诉我我做错了什么吗?

4

1 回答 1

0

我只是遇到了同样的问题,并且偶然发现它不起作用,如果我尝试使用 firefox(实际上是 linux 下的 icedove),但如果我尝试使用 eclipse 内置浏览器,它工作得很好。

即便如此,这对我来说没有意义,您是否已经尝试过使用不同的浏览器?

于 2014-05-16T20:54:35.063 回答