通用 JSF 实体转换器
我正在编写我的第一个Java EE 6 Web应用程序作为学习练习。我没有使用框架,只是使用JPA 2.0,EJB 3.1和JSF 2.0。
我有一个自定义转换器,用于将存储在SelectOne组件中的JPA实体转换回实体。我正在使用 InitialContext.lookup 来获取对 Session Bean 的引用,以查找相关实体。
我想创建一个通用的实体转换器,这样我就不必为每个实体创建一个转换器。我想我会创建一个抽象实体,并让所有实体扩展它。然后为抽象实体创建自定义转换器,并将其用作所有实体的转换器。
这听起来是否合理和/或可行?
没有一个抽象的实体,只有一个转换任何实体的转换器会更有意义吗?在这种情况下,我不确定如何获得对相应会话Bean的引用。
我已经包含了我当前的转换器,因为我不确定我是否以最有效的方式获取对会话Bean的引用。
package com.mycom.rentalstore.converters;
import com.mycom.rentalstore.ejbs.ClassificationEJB;
import com.mycom.rentalstore.entities.Classification;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;
import javax.naming.InitialContext;
import javax.naming.NamingException;
@FacesConverter(forClass = Classification.class)
public class ClassificationConverter implements Converter {
private InitialContext ic;
private ClassificationEJB classificationEJB;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
try {
ic = new InitialContext();
classificationEJB = (ClassificationEJB) ic.lookup("java:global/com.mycom.rentalstore_RentalStore_war_1.0-SNAPSHOT/ClassificationEJB");
} catch (NamingException e) {
throw new ConverterException(new FacesMessage(String.format("Cannot obtain InitialContext - %s", e)), e);
}
try {
return classificationEJB.getClassificationById(Long.valueOf(value));
} catch (Exception e) {
throw new ConverterException(new FacesMessage(String.format("Cannot convert %s to Classification - %s", value, e)), e);
}
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return String.valueOf(((Classification) value).getId());
}
}