Я пишу свое первое веб-приложение Java EE 6 в качестве учебного упражнения. Я не использую фреймворк, только JPA 2.0, EJB 3.1 и JSF 2.0.
У меня есть пользовательский конвертер для преобразования объекта JPA, хранящегося в компоненте SelectOne, обратно в Entity. Я использую InitialContext.lookup для получения ссылки на сеанс Bean, чтобы найти соответствующий объект.
Я хотел бы создать общий конвертер Entity, поэтому мне не нужно создавать конвертер на Entity. Я думал, что создам абстрактную сущность и все ее объекты расширят. Затем создайте пользовательский конвертер для абстрактного объекта и используйте его как конвертер для всех сущностей.
Звучит ли это разумно и/или практически невозможно?
Не имеет ли смысл иметь абстрактный объект, просто конвертер, который преобразует любой объект? В этом случае я не уверен, как получить ссылку на соответствующий сеанс 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());
}
}