Ідентифікація та вирішення javax.el.PropertyNotFoundException: Ціль недосяжний


127

При спробі посилатися на керований боб в EL так #{bean.entity.property}, іноді javax.el.PropertyNotFoundException: Target Unreachableвикидається виняток, як правило, коли потрібно встановити властивість bean або коли слід викликати дію bean.

Здається, існує п’ять різних типів повідомлень:

  1. Ціль Недоступний, ідентифікатор 'bean' вирішений до нуля
  2. Ціль недосяжна, "суб'єкт" повернув нуль
  3. Націлити недосяжно, "null" повернуто null
  4. Націлити недосяжно, "0" повернуто нулем
  5. Ціль недосяжний, "BracketSuffix" повернув нуль

Що вони всі означають? Як вони спричинені та як їх вирішувати?


Для тих, хто використовує weblogic, спробуйте це посилання. /programming/45422943/why-is-target-unreachable-identifier-
разрешений-to-null-on-weblogic/45490295#45490295

Для тих, хто використовує весну та weblogic, спробуйте перейти за цим посиланням. /programming/45422943/why-is-target-unreachable-identifier-
разрешений-to-null-on-weblogic?noredirect=

Раптом це зламалося для мене ... Я це виправив (він не розпізнає мій квасоля), зупинивши сервер, видаливши javax.faces.jar (Mojarra), видаливши каталог збирання та очистивши \ tmp \ сервера мого сервера WebLogic. і \ cache \ папки в домені, знову запустивши сервер, намагаючись опублікувати та не вдатися, оскільки він не може знайти javax, SVN-повернення видалення javax.faces.jar (так що ви можете просто перемістити його та потім перенести його назад) та публікацію. Раптом це знову спрацювало ...
Ендрю

Завжди перевіряйте кілька рядків вище щодо відповідних повідомлень журналу, що трапилися при розгортанні, ось це була справжня першопричина: Class [ Lorg/mxchange/jfinancials/model/receipt/FinancialAdminReceiptSessionBeanRemote; ] not found. Error while loading [ cl ass org.mxchange.jfinancials.beans.financial.model.receipt.FinancialAdminReceiptWebRequestBean ]]]І цей бін ( FinancialAdminReceiptWebRequestBean) не вдалося знайти і вирішити nullнапевно. Ще одна поширена помилка - не перезавантажувати сервер додатків після, наприклад, перейменування чи переміщення класів / інтерфейсів (або забутих clean).
Роланд

Відповіді:


239

1. Націлити недосяжно, ідентифікатор 'bean' вирішений до нуля

Це зводиться до того, що саме керований екземпляр біна не міг бути знайдений точно таким ідентифікатором (керованим ім'ям біна) в EL, як це #{bean}.

Визначення причини можна розділити на три етапи:

а. Хто керує квасолею?
б. Яке (за замовчуванням) керована назва квасолі?
c. Де клас підкладки з квасолі?

1а. Хто керує квасолею?

Першим кроком буде перевірка того, яка структура управління квасолею відповідає за керування екземпляром квасолі. Це JSF через @ManagedBean? Або це CDI через @Named? Або це весна через @Component? Чи можете ви переконатись, що ви не змішуєте конкретні примітки щодо управління декількома бобами для того самого класу резервних бобів? Наприклад @Named @Component, або @Named @ManagedBean, або @ManagedBean @Component. Це неправильно. Бін повинен керуватися, щонайменше, однією рамкою управління бобом, і ця структура повинна бути належним чином налаштована. Якщо ви вже не маєте ідеї, що обрати, перейдіть до фасолі фасолі (@ManagedBean) або CDI Beans (@Named)? та Spring JSF інтеграція: як ввести компонент Spring / службу в керований JSF боб?

Якщо JSF керує квасолею @ManagedBean, вам потрібно переконатися в наступному:

  • faces-config.xmlКоренева декларація сумісна з JSF 2.0. Таким чином, файл XSD і versionобов'язковим , по крайней мере вказати JSF 2.0 або вище і , отже , НЕ 1.x.

    <faces-config
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
        version="2.0">

    Для JSF 2.1 просто замініть 2_0і 2.0відповідно, 2_1і 2.1відповідно.

    Якщо ви користуєтеся JSF 2.2 або новішою версією, переконайтеся, що ви використовуєте xmlns.jcp.orgпростори імен замість java.sun.comусіх місць.

    <faces-config
        xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
        version="2.2">

    Для JSF 2.3 просто замініть 2_2і 2.2відповідно, 2_3і 2.3відповідно.

  • Ви не випадково імпортували javax.annotation.ManagedBeanзамість цього javax.faces.bean.ManagedBean. Будьте уважні за допомогою автоматичного заповнення IDE, Eclipse, як відомо, автоматично запропонував неправильний варіант як перший елемент у списку.

  • Ви не @ManagedBeanзамінили <managed-bean>запис у стилі JSF 1.x у faces-config.xmlтому самому класі резервного боба разом з іншим керованим назвою квасолі. Цей має перевагу над @ManagedBean. Реєстрація керованого квасолі в faces-config.xmlне потрібна, оскільки JSF 2.0, просто видаліть її.
  • Ваш клас маршруту виконання чистий і не містить дублікатів JAR-файлів, пов'язаних з JSF API. Переконайтеся, що ви не змішуєте кілька реалізацій JSF (Mojarra та MyFaces). Переконайтеся, що ви не надаєте інший файл JAR API JSF або навіть Java EE API разом з webapp, коли цільовий контейнер вже з’єднує API JSF у вікні. Дивіться також "Встановлення JSF" на нашій сторінці вікі JSF для інструкцій із встановлення JSF. Якщо ви маєте намір оновити контейнер JSF, що постачається з WAR, замість самого контейнера, переконайтесь, що ви доручили цільовому контейнерові використовувати JSF API / impl, що входить у пакет WAR.
  • Якщо ви упаковуєте боби з керованою JSF у JAR, то переконайтеся, що JAR має принаймні сумісний JSF 2.0 /META-INF/faces-config.xml. Див. Також Як посилатися на керовані JSF боби, які містяться у файлі JAR?
  • Якщо ви на самому справі з допомогою юрського JSF 1.x, і ви не можете оновити, то вам необхідно зареєструвати компонент через <managed-bean>в faces-config.xmlзамість @ManagedBean. Не забудьте виправити шлях створення проекту таким чином, щоб у вас більше не було бібліотек JSF 2.x (щоб @ManagedBeanанотація не була заплутано успішно зібрана).


Якщо CDI керує квасолею @Named, вам потрібно переконатися в наступному:

  • CDI 1.0 (Java EE 6) потребує /WEB-INF/beans.xmlфайлу, щоб включити CDI у WAR. Він може бути порожнім або мати лише такий вміст:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://java.sun.com/xml/ns/javaee" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                               http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
    </beans>
  • CDI 1.1 (Java EE 7) без будь-якого beans.xml, або порожній beans.xmlфайл, або з вищевказаними сумісними CDI 1.0 beans.xmlповодитимуться так само, як CDI 1.0. Коли є CDI 1.1 сумісний beans.xmlз явним version="1.1", то він за замовчуванням буде реєструвати тільки @Namedбоби з явною КДІ області видимості анотації , такі як @RequestScoped, @ViewScoped, @SessionScoped, @ApplicationScopedі т.д. У разі , якщо ви збираєтеся реєструвати всі боби в якості КДІ керованих компонентів, навіть без явного Об'єм CDI, використовуйте наведений нижче CDI 1.1, сумісний /WEB-INF/beans.xmlіз bean-discovery-mode="all"набором (типовим є bean-discovery-mode="annotated").

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                               http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
           version="1.1" bean-discovery-mode="all">
    </beans>
  • Під час використання CDI 1.1+ з bean-discovery-mode="annotated"(за замовчуванням) переконайтеся, що ви випадково не імпортували область JSF, наприклад javax.faces.bean.RequestScopedзамість області CDI javax.enterprise.context.RequestScoped. Слідкуйте за допомогою автозаповнення IDE.

  • Якщо ви використовуєте Mojarra 2.3.0-2.3.2 та CDI 1.1+ з bean-discovery-mode="annotated"(за замовчуванням), вам потрібно оновити Mojarra до 2.3.3 або новішої версії через помилку . У разі , якщо ви не можете оновити, то вам потрібно або набір bean-discovery-mode="all"в beans.xml, або поставити JSF 2.3 конкретну @FacesConfigанотацію довільного класу в WAR ( як правило , свого роду додатком запуску клас область дії).
  • Контейнери, що не містять Java EE, такі як Tomcat та Jetty, не постачаються з пакетом CDI. Встановити його потрібно вручну. Це трохи більше роботи, ніж просто додавання бібліотечних JAR (s). Що стосується Tomcat, переконайтеся, що дотримуєтесь інструкцій у цій відповіді: Як встановити та використовувати CDI на Tomcat?
  • Ваш клас маршруту виконання чистий і не містить копій JAR, пов'язаних з CDI API. Переконайтеся, що ви не змішуєте кілька реалізацій CDI (Weld, OpenWebBeans тощо). Переконайтеся, що ви не надаєте інший CDI-файл або навіть файл Java JE API JAR разом з webapp, коли цільовий контейнер вже з’єднує CDI API у вікні.
  • Якщо ви упаковуєте боби, керовані CDI, для переглядів JSF в JAR, то переконайтеся, що JAR має принаймні дійсний /META-INF/beans.xml(який може залишатися порожнім).


У випадку, якщо саме Весна управляє квасолею @Component, вам потрібно переконатися в наступному:

  • Весна встановлюється та інтегрується відповідно до її документації . Що важливо, вам потрібно принаймні мати це у web.xml:

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    І це в faces-config.xml:

    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>
  • (вище все, що я знаю щодо Spring - я не роблю Spring - не соромтесь редагувати / коментувати інші ймовірні причини, пов'язані з Spring; наприклад, деякі проблеми, пов’язані з конфігурацією XML)


У разі , якщо це компонент ретранслятора , який управляє (вкладеним) бобом через його varатрибут (наприклад <h:dataTable var="item">, <ui:repeat var="item">, <p:tabView var="item">і т.д.) , і ви на самому справі отримали «Target недосяжна, ідентифікатор" елемент "вирішив нуль», то вам необхідно переконатися в наступному :

  • На #{item}посилання не bindingвказано жодного дочірнього компонента. Це неправильно, оскільки bindingатрибут запускається під час збирання перегляду, а не під час візуалізації перегляду. Більше того, у дереві компонентів фізично є лише один компонент, який просто повторно використовується під час кожного раунду ітерації. Іншими словами, ви насправді повинні використовувати binding="#{bean.component}"замість цього binding="#{item.component}". Але набагато краще - позбутися бінінгу компонентів взагалі та дослідити / запропонувати належний підхід до проблеми, яку ви думали вирішити таким чином. Див. Також Як працює атрибут "прив'язки" у JSF? Коли і як його слід застосовувати?


1б. Яке (за замовчуванням) керована назва квасолі?

Другим кроком буде перевірка зареєстрованого керованого імені квасолі. Умови використання JSF та Spring відповідають стандартам JavaBeans, тоді як CDI має винятки залежно від імпульсу / версії CDI.

  • FooBeanКлас підтримки бобу , як показано нижче,

    @Named
    public class FooBean {}

    буде у всіх структурах управління бобом мати керовану назву бобів за замовчуванням #{fooBean}відповідно до специфікації JavaBeans.

  • FOOBeanКлас підтримки бобу , як показано нижче,

    @Named
    public class FOOBean {}

    чиє некваліфіковане ім'я класу починається щонайменше з двох великих літер, у JSF та Spring буде мати за замовчуванням кероване ім'я квасолі саме некваліфікованого імені класу #{FOOBean}, також відповідають специфікації JavaBeans. Що стосується CDI, це також у версіях Weld, випущених до червня 2015 року, але не у версіях Weld, випущених після червня 2015 року (2.2.14 / 2.3.0.B1 / 3.0.0.A9), а також у OpenWebBeans через контроль в КДІ специфікації . У цих версіях Weld і в усіх версіях OWB це лише з першим символом з нижнього регістру #{fOOBean}.

  • Якщо ви чітко вказали ім’я керованої квасолі, fooяк нижче,

    @Named("foo")
    public class FooBean {}

    або еквівалентно с @ManagedBean(name="foo") або @Component("foo"), тоді він буде доступний лише #{foo}тим самим і, отже, не самим #{fooBean}.


1с. Де клас підкладки з квасолі?

Третім кроком буде подвійна перевірка, якщо клас резервного боба знаходиться у потрібному місці у вбудованому та розгорнутому файлі WAR. Переконайтесь, що ви належним чином виконали повний чистий, відновити, переустановити та перезапустити проект та сервер у випадку, якщо ви насправді були зайняті написанням коду та нетерплячим натисканням клавіші F5 у браузері. Якщо все-таки даремно, дозвольте системі збирання створити файл WAR, який ви потім витягнете та перевірите інструментом ZIP. Скомпільований .classфайл класу backing bean повинен містити структуру пакунків у /WEB-INF/classes. Або, коли він упакований як частина модуля JAR, JAR, що містить скомпільований .classфайл, повинен міститись /WEB-INF/libі, таким чином, не бути, наприклад, EAR /libабо в іншому місці.

Якщо ви використовуєте Eclipse, переконайтесь, що клас резервного боба є, srcа отже, ні WebContent , і переконайтесь, що Project> Build Automatically включено. Якщо ви використовуєте Maven, переконайтеся, що клас клавіатури підтримується src/main/javaі, отже, не знаходиться в src/main/resourcesабо src/main/webapp.

Якщо ви упаковуєте веб-додаток як частину EAR за допомогою EJB + WAR (s), то вам потрібно переконатися, що класи підкладки в модулі WAR і, отже, не в модулі EAR, ані в модулі EJB. Діловий рівень (EJB) повинен бути без будь-яких артефактів, пов’язаних із веб-рівнем (WAR), так що діловий рівень може бути повторно використаний у кількох різних ярусах (JSF, JAX-RS, JSP / Servlet тощо).


2. Націлити недосяжно, "сутність" повернула нуль

Це зводиться до цього вкладеного властивості, entityяк у #{bean.entity.property}поверненому null. Зазвичай це виявляється лише тоді, коли JSF потрібно встановити значення для propertyвхідного компонента, як показано нижче, а #{bean.entity}фактично поверненогоnull .

<h:inputText value="#{bean.entity.property}" />

Ви повинні переконатися , що ви підготували модель об'єкт заздалегідь в @PostConstruct, або <f:viewAction>метод, або , можливо, add()метод дії в разі , якщо ви працюєте зі списками CRUD і / або діалогові вікна на ту ж точку зору.

@Named
@ViewScoped
public class Bean {

    private Entity entity; // +getter (setter is not necessary).

    @Inject
    private EntityService entityService;

    @PostConstruct
    public void init() {
        // In case you're updating an existing entity.
        entity = entityService.getById(entityId);

        // Or in case you want to create a new entity.
        entity = new Entity();
    }

    // ...
}

Щодо важливості @PostConstruct; зробити це в звичайному конструкторі не вдасться, якщо ви використовуєте структуру управління bean, яка використовує проксі , такі як CDI. Завжди використовуйте @PostConstructдля підключення керованої ініціалізації екземпляра біна (і використовуйте @PreDestroyдля підключення до керованого знищення екземпляра біна). Крім того, у конструкторі ви б ще не мали доступу до будь-яких введених залежностей, див. Також NullPointerException, намагаючись отримати доступ до @Inject bean в конструкторі .

У випадку, якщо entityIdпостачається через <f:viewParam>, вам потрібно буде використовувати <f:viewAction>замість @PostConstruct. Дивіться також Коли використовувати f: viewAction / preRenderView проти PostConstruct?

Вам також потрібно переконатися, що ви зберігаєте немодель nullпід час розсилки, якщо ви створюєте її лише add()методом дії. Найпростіше було б поставити квасоля в поле зору. Див. Також Як правильно вибрати область бобів?


3. Націлити недосяжно, "null" повернуто null

Це насправді та сама причина, що і №2, лише використовувана (старіша) реалізація EL є дещо помилковою у збереженні імені властивості для відображення у повідомленні про виключення, яке в кінцевому підсумку неправильно виставляється як "null". Це лише налагоджує налагодження та виправляє трохи важче, якщо у вас є такі вкладені властивості, як це #{bean.entity.subentity.subsubentity.property}.

Рішення все одно - переконайтесь, що відповідного вкладеного об'єкта немає nullна всіх рівнях.


4. Націлити недосяжно, "0" повернуто нулем

Це також є тією ж причиною, що і №2, лише (використовувана) старша реалізація EL є помилковою у формулюванні повідомлення про виключення. Це виявляється лише тоді, коли ви використовуєте позначення дужок []в EL, як #{bean.collection[index]}там, де #{bean.collection}сам по собі є недійсним, але елемент у вказаному індексі не існує. Тоді таке повідомлення слід інтерпретувати як:

Націлити недосяжно, "колекція [0]" повернула нуль

Рішення також таке ж, як №2: переконайтеся, що предмет колекції доступний.


5. Націлити недосяжно, "BracketSuffix" повернув нуль

Це насправді та сама причина, що і №4, лише використовувана (старіша) реалізація EL дещо помиляється при збереженні індексу ітерації для відображення у повідомленні про виключення, яке в кінцевому підсумку неправильно виявляється як "BracketSuffix", що є насправді символом ]. Це лише робить налагодження і виправляти трохи складніше, коли у колекції є кілька елементів.


Інші можливі причини javax.el.PropertyNotFoundException:


Я біжу на номер 3. #{bean.entity.property}робить значення, але <p:selectBooleanCheckbox value="#{bean.entity.property}"/>не вдається. Мій булевий має сетер. Ціле число об'єкт на одній і тій же сутності робить роботу при використанні в поле введення. Будь-які ідеї?
Джаспер де Вріс

Ще одна річ, яку варто перевірити - переконатися, що ваші реалізації JSF та CDI інтегруються, що було моєю проблемою: stackoverflow.com/questions/44064995/…
Джеррі Б. №1 стажер

Відповідно: Target Unreachable, identifier 'bean' resolved to nullУ мультимодульних проектах maven (містять модулі для ejb, web, ear) переконайтесь, що ваш веб-модуль оголошує залежність від вашого ejb-модуля. Без цього @ManagedBeanне можна вирішити використання JSF2.0, і вам доведеться їх оголосити в faces-config.xml. Забрав мене близько двох годин, помітивши, що я не оголосив про залежність включати ejb у свій веб-модуль (у мене було лише ejb та web у вусі)
біш

1
@bish Артефакти переднього типу, такі як @ManagedBeanкласи, в першу чергу не належать до рівня обслуговування (проект EJB). Дивіться також stackoverflow.com/questions/13011392/jsf-service-layer
BalusC

Чи може боб не бути серіалізаційним, також може призвести до цієї помилки (як я підозрюю, це справа в stackoverflow.com/questions/47533584/… (але зараз я не можу спробувати))
Kukeltje

6

Для тих, хто все ще застряг ...

Використовуючи NetBeans 8.1 та GlassFish 4.1 з CDI, я чомусь мав цю проблему лише локально, а не на віддаленому сервері. У чому трюк:

-> використання javaee-web-api 7.0 замість типової версії pom, наданої NetBeans, що є javaee-web-api 6.0, так:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
    <type>jar</type>
</dependency>

-> завантажте цей javaee-web-api-7.0.jar як lib на сервер (папка lib у папці domain1) та перезапустіть сервер.


Це відповідає "Ваш клас маршруту виконання чистий і не містить дублікатів у JAR, пов'язаних з CDI API". Іншими словами, ваш клас виконання маршруту якимось чином переплутався з дублікатами бібліотек.
BalusC

Дійсно, і ваша відповідь допомогла мені визначити ймовірне питання, над яким я повинен зосередитись ;-) Просто виклавши тут деталі мого конкретного рішення, це може заощадити час на пару користувачів.
seinecle

1

Я вирішив поділитися своїм висновком щодо цієї помилки після її вирішення.

Перш за все, до рішень BalusC слід поставитися серйозно, але потім є ще одна ймовірна проблема в Netbeans, про яку слід пам'ятати, особливо, будуючи проект для корпоративного застосування (EAR) за допомогою Maven.

Netbeans створює батьківський файл POM , an проект EAR , в проект EJB і проект WAR . Все інше в моєму проекті було добре, і я майже припустив, що проблема - це помилка, ймовірно, у GlassFish 4.0 (мені довелося встановити та підключити його до Netbeans), оскільки GlassFish 4.1 має помилку Weld CDI, яка робить вбудований GlassFish 4.1 в Netbeans 8.0. 2 непридатний, за винятком пластиру.

Рішення:

Для того, щоб вирішити «Target UNREACHABLE, ідентифікатор" боб "вирішив нуль» error-

I Клацніть правою кнопкою миші батьківський проект POM та виберіть Властивості . З'явиться діалогове вікно властивостей проекту, натисніть "Джерела", ви здивуєтеся, коли " Джерело / Бінарний формат " встановлено на 1,5 та " Кодування " встановлено на Windows 1250. Змініть " Джерело / Бінарний формат" " на 1.6 0р 1.7, залежно від того ви віддаєте перевагу сумісність свого проекту CDI та " Кодування " UTF-8.

Зробіть те саме для всіх інших підпроектів (EAR, EJB, WAR), якщо вони вже не сумісні. Запустіть проект, і ви більше не отримаєте цю помилку.

Я сподіваюся, що це допоможе комусь там, хто має подібні помилки.


Я вважаю вашу відповідь важкою для розуміння в цілому (на багато інших видів, що не пов'язані безпосередньо), а також те, що джерело / двійковий формат та кодування відіграють роль у цьому питанні. Ви впевнені, що зміна цього процесу не призвело до того, що це питання вирішило проблему?
Kukeltje

1

Я вирішив поділитися своїм рішенням, тому що хоча багато відповідей, наданих тут, були корисними, у мене все ще була ця проблема. У моєму випадку я використовую JSF 2.3, jdk10, jee8, cdi 2.0 для свого нового проекту, і я запустив свою програму на wildfly 12, запускаючи сервер із параметром standalone.sh -Dee8.preview.mode = вірно, як рекомендовано на веб-сайті wildfly . Проблема з "бобом вирішено на нуль" зникла після завантаження wildfly 13. Завантаження точно такої самої війни в wildfly 13 змусило це працювати.


1

Я затримався на цій помилці, оскільки в класі, який має, @SpringBootApplicationя забув вказати назву пакета контролера.

Цього разу я хотів би бути більш конкретним, вказавши, які компоненти Spring повинен був сканувати, замість конфігурації базового пакету.

Це було так:

@ComponentScan(basePackages = {"br.com.company.project.repository", "br.com.company.project.service"})

Але правильна форма є однією з таких:

@ComponentScan(basePackages = {"br.com.company.project.repository", "br.com.company.project.service", "br.com.company.project.controller"})

@ComponentScan(basePackages = {"br.com.company.project")

Я вирішив поділитися своїм рішенням, оскільки, хоча правильна відповідь дуже вичерпна, вона не покриває цю (ідіотичну) помилку :)


0

У моєму випадку я допустив помилку з написанням в @Named ("beanName"), це, мабуть, було "beanName", але я написав, наприклад, "beanNam".


0

Я використовую wildfly 10 для контейнера javaee. У мене виникла проблема "Цільова недосяжність", "сутність" повернула нуль ". Дякую за пропозиції BalusC, але мою проблему поза рішенням пояснив. Випадково використовується "імпортувати com.sun.istack.logging.Logger;" замість "імпорту org.jboss.logging.Logger;" викликав CDI, реалізований JSF EL. Сподіваюся, це допомагає покращити рішення.


0

У мене була така ж проблема. Рішення виявилося набагато простішим. Виявляється, що таблиця даних хоче метод у вигляді getter, тобто getSomeMethod (), а не лише someMethod (). У моєму випадку в таблиці даних я дзвонив findResults. Я змінив метод в моєму резервному бобі на getFindResults (), і він спрацював.

КомандаButton працювала на знаходженні без того get, який служив для того, щоб зробити його лише більш заплутаним.


0

Що стосується №2, то в моєму випадку воно чарівно ожило після заміни

<body>

з тегом

<h:body>

Зробивши декілька (простіше, чесно кажучи) проектів JSF, я не міг пригадати, щоб зробити щось інше, налаштувавши його зараз, і вперше отримав подібну помилку. Я робив дуже основну сторінку входу (ім’я користувача, пароль, користувальницьку Bean ...) і налаштовував все, як зазвичай. Єдина відмінність, яку я помітив, - це згадані вище теги. Можливо, хтось вважає це корисним.


0

Проблема в моєму випадку полягала в тому, що я включив конструктор, що приймає параметри, але не порожній конструктор з анотацією Inject, як це було.

@Inject public VisitorBean() {}

Я просто протестував це без будь-якого конструктора, і, здається, це також працює.


0

Для 1. теми ( Target Unreachable, ідентифікатор "bean" вирішений до нуля) );

Я перевірив цінні відповіді на @BalusC та інших акціонерів, але я перевищив цю проблему, як це у моєму сценарії. Після створення нового xhtml з іншою назвою та створення класу bean з іншою назвою я тоді писав (не копіював-вставляв) коди крок за кроком до нового класу bean та нового файлу xhtml.


0

Коли я видаляю контекстний парам AnnotationConfigWebApplicationContext з файлу web.xml Це робота

Якщо у вас є такий парам, який, як показано нижче, потрібно видалити його з файлу web.xml

<context-param>
    <param-name>contextClass</param-name>
    <param-value>
      org.springframework.web.context.support.AnnotationConfigWebApplicationContext
  </param-value>
</context-param> 

Потрібно розібратися, чому це вирішує? А точніше, чому це викликає проблеми?
Kukeltje

-1

Робота з JSF у старому стилі Ви повинні визначити керований боб у файлі боб-config.xml (розташований у папці WEB-INF) та зробити посилання на нього у файлі web.xml таким чином:

боби-config.xml

<managed-bean>
  <managed-bean-name>"the name by wich your backing bean will be referenced"</managed-bean-name>
  <managed-bean-class>"your backing bean fully qualified class name"</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>    
</managed-bean>

(Я намагався використовувати інші сфери, але ...)

web.xml

<context-param>
  <param-name>javax.faces.CONFIG_FILES</param-name>
  <param-value>"/WEB-INF/beans-config.xml</param-value>
</context-param>

-2

Ще одна підказка: я використовував JSF та додав mvn залежності: com.sun.faces jsf-api 2.2.11

    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-impl</artifactId>
        <version>2.2.11</version>
    </dependency>

Потім я спробував перейти на Primefaces і додати залежність від прейфектів:

<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>6.0</version>
</dependency>

Я змінив свій xhtml з h: на p:, додавши xmlns: p = "http://primefaces.org/ui до шаблону. Тільки з JSF проект працював нормально, а керований бік був досягнутий нормально. Коли я додаю Primefaces Я отримував недоступний об'єкт (javax.el.propertynotfoundexception). Проблема полягала в тому, що JSF генерував ManagedBean, а не Primefaces, і я просив проінверсії для об'єкта. Мені довелося видалити jsf-impl з мого .pom, clean та встановити proyect. З цього моменту все нормально. Сподіваюся, що це допомагає.


2
Ваше припущення про причину проблеми не має сенсу. PrimeFaces - це зовсім не реалізація JSF. Це відповідає вимозі "Ваш клас маршруту виконання чистий і не містить копій JAR, пов'язаних з CDI API". Іншими словами, ваш клас виконання маршруту якимось чином змішався з дублікатами бібліотек, а PrimeFaces лише збільшував його, не викликаючи.
BalusC

-3

EL інтерпретує $ {bean.propretyName} як описано - властивістьName стає getPropertyName () за умови, що ви використовуєте явні або неявні методи генерації getter / setters

Ви можете змінити цю поведінку, чітко визначивши ім'я як функцію: $ {bean.methodName ()} Це викликає метод функції Name () безпосередньо без змін.

Не завжди вірно, що ваші аксесуари мають назву "отримати ...".


1
Це не є правильною практикою, і це унеможливлює виклик правильних сеттерів за вхідними компонентами. Це також не може бути причиною зазначеного винятку. Це призвело б лише до вказаного винятку, що ви допустили помилку при посиланні на властивість у виразі методу дії, наприклад, action="#{bean.property}"замість action="#{bean.method}".
BalusC

помітно, що у світі сучасної Java з функціональним програмуванням ця "правильна практика" змінюється. Див. Dev.to/scottshipp/… та посилання на які. Зауважте, що Lombok має налаштування "fluent", де get / set не додано. У нашій компанії є 1000 інженерів, які, схоже, мають інший погляд на сучасну практику.
sdw

1
Я думаю, ви і ваші 1000 інженерів плутаєте властивості з методами.
BalusC

Така практика дизайну стає поширеною в масштабних програмах з дуже високою одночасністю. Я б запропонував, щоб ваш голос базувався на одному погляді на керівні принципи дизайну, а не на цілі відповіді, допомагаючи нашому величезному колу виявити потенційну помилку.
sdw

1
Так? Вибачте, я не можу ігнорувати враження, що ти поняття не маєш, про що ти говориш.
BalusC

-3

У моєму випадку "el-ri-1.0.jar" відсутній.


1
Зазвичай вам це зовсім не потрібно, тож є щось інше. Швидше за все, брудний клас виконання. Ви повинні виправити це, замість того, щоб погіршити його в довгостроковій перспективі, додавши бібліотеки, які, як передбачається, вже надані сервером.
BalusC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.