Я никогда не использовал JSF 2.0 (только 1.0), но в главе 5.4 спецификации сказано:
.[...] разрешить контейнеру впрыскивать ссылки на ресурсы, управляемые контейнерами, в управляемый бобовый экземпляр, прежде чем он станет доступен для приложения JSF. Только бобы заявлены как находящиеся в запросе, сеанс или область применения доступен для инъекций ресурсов.
Но пока я понимаю, что поиск JNDI должен помочь.
Задача, которую вы пытаетесь выполнить, равносильна рисованию случайной точки из N-мерного единичного симплекса.
http://en.wikipedia.org/wiki/Simplex#Random_sampling может вам помочь.
Наивное решение может быть следующим:
public static double[] getArray(int n)
{
double a[] = new double[n];
double s = 0.0d;
Random random = new Random();
for (int i = 0; i < n; i++)
{
a [i] = 1.0d - random.nextDouble();
a [i] = -1 * Math.log(a[i]);
s += a[i];
}
for (int i = 0; i < n; i++)
{
a [i] /= s;
}
return a;
}
Чтобы вывести пункт равномерно из N-мерного единичного симплекса, мы должны взять вектор экспоненциально распределенных случайных величин, затем нормализовать его по сумме этих переменных. Для получения экспоненциально распределённого значения берем отрицательное регистрация
равномерно распределённого значения.
Стандарт ничего не говорит о том, как реализовать полиморфизм. Один класс vtbl и один объект vptr - самый популярный способ. Надеюсь, следующий псевдокод будет полезен.
typedef struct {
void (*show)(void* self);
// more
} person_vtbl;
typedef struct {
person_vtbl* vtbl;
char name[20];
} person;
void person_show(void* self) {
cout<<"inside ... "<<static_cast<person*>(self)->name;
}
// more
static person_vtbl person_vtbl_ = { &person_show }; // vtbl for person class
void person_ctor(void* self, char const* name) {
person* p = static_cast<person*>(self);
strcpy(p->name, name);
p->vtbl = &person_vtbl // vptr of person object
}
typedef struct {
person base;
int scale;
} teacher;
void teacher_show(void* self) {
cout<<"inside the tearch ... "<<static_cast<teacher*>(self)->scale;
}
static person_vtbl teacher_vtbl_ = { &teacher_show };
void teacher_ctor(void* self, char const* name, int s) {
teacher* t = static_cast<teacher*>(self);
person_ctor(&t->base, name); // construct base part
t->scale = s; // construct teacher part
t->vtbl = &teacher_vtbl_; // vptr of teacher object
}
// construct teacher :
// person* ptr = new teacher("Zia", 16);
teacher* tmp = static_cast<teacher*>( malloc( sizeof *tmp );
teacher_ctor(tmp, "Zia", 16); // vptr of tmp points to teacher_vtbl_
person* ptr = &tmp->base;
// call virtual function though pointer
// ptr->show()
ptr->vptr->show(ptr); // call teacher_show(ptr);
-121--3787356- Другим (еще не таким симпатичным) решением может быть использование связывания вместо converterId. Использование только управляемых компонентов JSF:
< f: converter binding = «# {app.personConverter} »/>
Где appBean обозначает нечто подобное:
@ ManagedBean (имя = «приложение»)
@ StartScoped
класс AppBean {
@ EJB
PersonService ps;
частный конвертер PersonConverter;
}
В CDI-стиле (JSR-299) МОЖЕТ быть более подходящее решение, но не удалось выполнить это:
< f: converter binding = «# {cdiBean} »/>
Где cidBean должен быть:
@ Именованный класс CdiBean реализует Converter {@ EJB...}
Сбой при вызове поведения по умолчанию для запроса идентификатора converter-id, переданного в конструкторе '
Anyhow first approach using binding and app scoped JSF bean works .
Расширение Seam Faces для JSF 2.0 и CDI позволяет поддерживать @Inject непосредственно в валидаторах и конвертерах.
Проверьте это: http://ocpsoft.com/java/seam-faces-3-0-0-alpha2-jsf-2-0-just-got-even-easier/