【发布时间】:2011-05-15 04:02:01
【问题描述】:
我正在编写我的第一个 Java EE 6 Web 应用程序作为学习练习。我没有使用框架,只是 JPA 2.0、EJB 3.1 和 JSF 2.0。
我有一个自定义转换器将存储在 SelectOne 组件中的 JPA 实体转换回实体。我正在使用 InitialContext.lookup 获取对会话 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());
}
}
【问题讨论】:
-
这是我的 allinone 类解决方案:stackoverflow.com/a/40069411/4158634
-
@BalusC 为什么这个问题被认为是“重复”,因为它早于(2010
-
日期有多重要?此外,它于 2015 年关闭。
-
@BalusC SO 说 之前 有人问过这个问题,并且已经有了答案,这是不正确的。不要生气,我知道你是THE超级善良/乐于助人的 JSF 专家,我喜欢全脸和你为使 JSF 变得更好所做的一切 (
</compliments>),但人们可能会认为,在 2 个问题中,您选择将没有接受您的答案的(较旧的)问题标记为重复,以宣传您的答案被接受的问题,这可能被人们视为不公平谁回答了最初的问题(尽管我认为您不是故意这样做的)。 -
确实如此。我是 OP,这是最初的问题。它不应该被标记为重复。先问后答。