この代替案に興味がある人のために、Inject アノテーションを、コンストラクターの BeanManager を介したプログラムによるルックアップに置き換えることができました。凝縮されたコードは以下のとおりです。私はパフォーマンスをテストしていませんが、それがマイナス面であると思われます。時間が許せば、Omnifaces ソリューションと比較します。
編集: BeanManager ルックアップのコストは最小限であることが判明しました。コンストラクターは平均で 1 ミリ秒未満かかります。
@FacesConverter(forClass = AbstractEntity.class)
public class EntityConverter implements Converter {
private LocationService locationService;
private Class entityClass;
//Special parameterized constructor for @FacesConverter described in the original question
public EntityConverter(Class entityClass) throws NamingException {
this.entityClass = entityClass;
this.locationService = loadManagedBean(LocationService.class, "locationService");
}
//Generic lookup method for @Named managed beans
protected <T> T loadManagedBean(Class<T> clazz, String beanName) throws NamingException {
InitialContext initialContext = new InitialContext();
BeanManager bm = (BeanManager) initialContext.lookup("java:comp/BeanManager");
Bean<T> bean = (Bean<T>) bm.getBeans(beanName).iterator().next();
CreationalContext<T> cc = bm.createCreationalContext(bean);
T beanInstance = (T) bm.getReference(bean, clazz, cc);
return beanInstance;
}
}