今天我注意到我的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方面使我的应用程序更不安全。有人可以向我解释发生了什么以及如何解决这个问题吗?
谢谢。
马科斯