JSF i bezpieczeństwo typu
Kiedy walczyłem godzinami, w końcu znalazłem te irytująceClassCastException
pochodzą z, jak sądziłem, były produkowane przez Hibernate i toenum
-mapowanie.
Ale pochodziły z mojego widoku JSF, gdzie zdałemList
z
<h:selectManyCheckbox value="#{createUserManager.user.roles}" ... >
<f:selectItems value="#{createUserManager.roles}"/>
</h:selectManyCheckbox>
z powrotem do mojej fasoli.
Moje dane składają się po prostu z wartości wyliczenia:public Role[] getRoles() { return Role.values(); }
.
Byłem naprawdę zszokowany, kiedy testowałem seterroles
wUser
-class i dostał to:
public void setRoles(List<Role> paramRoles) {
System.out.println(paramRoles.get(0) instanceof Role); //output: false
for(Role role : paramRoles){ ...} //crashes with ClassCastException
}
Wymiana pieniędzyList<Role> paramRoles
doList<String> paramRoles
działało idealnie.
Jak to jest możliwe? Czy te generyczne nie powinny być bezpieczne dla typu lub czy wymazywanie typu w związku z zabijaniem przez JSF całego elementu bezpieczeństwa typu?
Również nie powinna zwracać wartościh:selectManyCheckbox
byćList<Role>
, tak jak przeszedłem przezf:selectItems
?