好吧,我今天遇到了同样的问题,我通过创建一个通用的ConversionHelper并在转换器中使用了它来解决了这个问题。为此,我有一个EntityService,它是通用的SLSB,可用于对任何实体类型执行简单的CRUD操作。我的实体还实现了PersistentEntity接口,该接口具有getId和setId方法,并且使用简单的主键对其进行保存。而已。
最后,我的转换器看起来像这样:
@FacesConverter(value = "userConverter", forClass = User.class)public class UserConverter implements Converter { @Override public Object getAsObject(FacesContext ctx, UIComponent component, java.lang.String value) { return ConversionHelper.getAsObject(User.class, value); } @Override public String getAsString(FacesContext ctx, UIComponent component, Object value) { return ConversionHelper.getAsString(value); }}我的转换助手如下所示:
public final class ConversionHelper { private ConversionHelper() { } public static <T> T getAsObject(Class<T> returnType, String value) { if (returnType== null) { throw new NullPointerException("Trying to getAsObject with a null return type."); } if (value == null) { throw new NullPointerException("Trying to getAsObject with a null value."); } Long id = null; try { id = Long.parseLong(value); } catch (NumberFormatException e) { throw new ConverterException("Trying to getAsObject with a wrong id format."); } try { Context initialContext = new InitialContext(); EntityService entityService = (EntityService) initialContext.lookup("java:global/myapp/EntityService"); T result = (T) entityService.find(returnType, id); return result; } catch (NamingException e) { throw new ConverterException("EntityService not found."); } } public static String getAsString(Object value) { if (value instanceof PersistentEntity) { PersistentEntity result = (PersistentEntity) value; return String.valueOf(result.getId()); } return null; }}现在,为简单的JPA实体创建转换器只需复制一个转换器并更改3个参数即可。
这对我来说效果很好,但就样式和性能而言,我不知道这是否是最佳方法。任何提示将不胜感激。



