JSF应用程序中非常奇怪的转换行为

时间:2011-05-06 13:05:03

标签: jsf

今天我注意到我的JSF应用程序中存在一种非常奇怪的转换行为。请看一下:

我有一个这个CRUD基类,它打算由一些具体的托管bean类扩展:

public abstract class Cadastro<T, C extends Number> implements Serializable
{
    // _chave is the primary key
    private C _chave;
    // more fields...

    public C getChave()
    {
        return _chave;
    }

    public void setChave(C chave)
    {
        _chave = chave;
        if (_chave != null)
        {
            // More about this below...
            System.out.println(_chave.getClass().getName());
        }
    }

    // more methods...
}

这是一个扩展前一个类的具体托管bean类:

@ManagedBean
@ViewScoped
public class CadastroArquivos extends Cadastro<Arquivo, Short>
{
}

请注意主键的 Short 类型。

在页面中,我有一个输入文本组件,用于连接 Short 转换器的键:

<h:inputText value="#{cadastroArquivos.chave}">
    <f:converter converterId="javax.faces.Short" />
</h:inputText>

所以,正如你所看到的,在java方面,* _chave *字段在 CadastroArquivos 类中有 Short 类型,在页面方面有一个与此类型匹配的短转换器。但是当页面回发到服务器时,上面的 System.out.println 打印* _chave *类:

java.lang.Long中

而不是 java.lang.Short 。怎么会这样?

另外,如果我将 CadastroArquivos 类改为此类以强制进行更正确的转换:

@ManagedBean
@ViewScoped
public class CadastroArquivos extends Cadastro<Arquivo, Short>
{
    @Override
    public Short getChave()
    {
        return super.getChave();
    }

    @Override
    public void setChave(Short chave)
    {
        super.setChave(chave);
    }
}

我得到 ClassCastException

value =“#{cadastroArquivos.chave}”:java.lang.ClassCastException:java.lang.Long无法强制转换为java.lang.Short

但是如果我将 Cadastro 类的声明更改为此(注意 C 不再扩展 Number ):

public abstract class Cadastro<T, C> implements Serializable

一切正常,但是在java方面使我的应用程序更不安全。有人可以向我解释发生了什么以及如何解决这个问题吗?

谢谢。

马科斯

0 个答案:

没有答案