We appear to be having technical difficulties
Solution:
Remove all cookies for redhat.com domain.
Solution:
Remove all cookies for redhat.com domain.
import java.lang.reflect.Field;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.Id;
@Named
public class EntityConverter implements Converter {
@Inject
private EntityManager em;
public Object getAsObject(FacesContext fc, UIComponent component, String string) {
try {
String[] split = string.split(":");
return em.find(Class.forName(split[0]), Long.valueOf(split[1]));
} catch (NumberFormatException | ClassNotFoundException e) {
return null;
}
}
public String getAsString(FacesContext fc, UIComponent component, Object object) {
try {
Class<? extends Object> clazz = object.getClass();
for (Field f : clazz.getDeclaredFields()) {
if (f.isAnnotationPresent(Id.class)) {
f.setAccessible(true);
Long id = (Long) f.get(object);
return clazz.getCanonicalName() + ":" + id.toString();
}
}
} catch (IllegalArgumentException | IllegalAccessException e) {
}
return null;
}
}
And how to uset it? Not so big issue. In this example we want to show all user roles and user can choose from them:
<h:selectmanycheckbox converter="#{entityConverter}" value="#{bean.roles}">
<f:selectitems itemlabel="#{role.rolename]}" itemvalue="#{role}"
value="#{bean.allRoles}" var="role">
</f:selectitems>
</h:selectmanycheckbox>
If you have different Id types in different classes you can use converter like this. It will call valueOf method on your Id field type class. For example you have field userId which is Integer type, it will call Integer.valueOf(valueFromPage). This way you can load entity from entityManager because you have type of your entity and id of this entity with correct type.@Named
public class EntityConverter implements Converter {
@Inject
private EntityManager em;
@Inject
Logger log;
public Object getAsObject(FacesContext fc, UIComponent component,
String string) {
try {
String[] split = string.split(":");
Class clazz = Class.forName(split[0]);
for (Field f : clazz.getDeclaredFields()) {
if (f.isAnnotationPresent(Id.class)) {
Method valueOfMethod = f.getType().getMethod("valueOf",
String.class);
return em.find(clazz, valueOfMethod.invoke(null, split[1]));
}
}
} catch (ClassNotFoundException | NoSuchMethodException
| SecurityException | IllegalAccessException
| IllegalArgumentException | InvocationTargetException e) {
log.warn("Cannot convert", e);
}
return null;
}
public String getAsString(FacesContext fc, UIComponent component,
Object object) {
try {
Class clazz = object.getClass();
for (Field f : clazz.getDeclaredFields()) {
if (f.isAnnotationPresent(Id.class)) {
f.setAccessible(true);
return clazz.getCanonicalName() + ":" + f.get(object);
}
}
} catch (IllegalArgumentException | IllegalAccessException e) {
log.warn("Cannot convert", e);
}
return null;
}