При попытке сослаться на управляемый bean-компонент в EL подобным образом #{bean.entity.property}
иногда возникает javax.el.PropertyNotFoundException: Target Unreachable
исключение, обычно когда должно быть установлено свойство bean-компонента или когда должно быть вызвано действие bean-компонента.
Кажется, есть пять разных типов сообщений:
- Target Unreachable, идентификатор bean разрешен до нуля
- Target Unreachable, 'entity' вернул null
- Target Unreachable, 'null' вернул null
- Target Unreachable, '0' вернул null
- Target Unreachable, 'BracketSuffix' вернул null
Что все они означают? Как они возникают и как их решать?
Class [ Lorg/mxchange/jfinancials/model/receipt/FinancialAdminReceiptSessionBeanRemote; ] not found. Error while loading [ cl ass org.mxchange.jfinancials.beans.financial.model.receipt.FinancialAdminReceiptWebRequestBean ]]]
и этот bean (FinancialAdminReceiptWebRequestBean
) не может быть найден и решенnull
наверняка. Другая распространенная ошибка - не перезапускать сервер приложений, например, после переименования или перемещения классов / интерфейсов (или забытыхclean
).Ответы:
1. Цель недостижима, идентификатор bean преобразован в нуль
Это сводится к тому, что сам экземпляр управляемого компонента не может быть найден точно по этому идентификатору (имени управляемого компонента) в EL, например
#{bean}
.Выявление причины можно разбить на три этапа:
а. Кто управляет бином?
б. Какое имя (по умолчанию) управляемого bean-компонента?
с. Где бин-класс поддержки?
1a. Кто управляет бином?
Первым шагом будет проверка того, какая структура управления компонентами отвечает за управление экземпляром компонента. Это JSF через
@ManagedBean
? Или это через CDI@Named
? Или это Spring через@Component
? Можете ли вы убедиться, что вы не смешиваете несколько аннотаций, специфичных для инфраструктуры управления компонентами, в одном и том же классе вспомогательного компонента? Например@Named @Component
, или@Named @ManagedBean
, или@ManagedBean @Component
. Это не верно. Компонент должен управляться не более чем одной структурой управления компонентом, и эта структура должна быть правильно настроена. Если вы уже не знаете, что выбрать, перейдите к Backing beans (@ManagedBean) или CDI Beans (@Named)? и интеграция Spring JSF: как внедрить компонент / службу Spring в управляемый компонент JSF?В случае, если JSF управляет компонентом через
@ManagedBean
, вам необходимо убедиться в следующем:faces-config.xml
Корневая декларация совместима с JSF 2.0. Таким образом, файл XSD и файлversion
должны как минимум указывать JSF 2.0 или выше, а не 1.x.Для JSF 2.1 просто замените
2_0
и2.0
на2_1
и2.1
соответственно.Если вы используете JSF 2.2 или выше, убедитесь, что вы используете
xmlns.jcp.org
пространства имен, а неjava.sun.com
все места.Для JSF 2.3 просто замените
2_2
и2.2
на2_3
и2.3
соответственно.Вы случайно не импортировали
javax.annotation.ManagedBean
вместоjavax.faces.bean.ManagedBean
. Остерегайтесь автозаполнения IDE, известно, что Eclipse автоматически предлагает неправильный элемент в качестве первого элемента в списке.@ManagedBean
стиле JSF 1.x<managed-bean>
вfaces-config.xml
том же самом классе вспомогательного компонента вместе с другим именем управляемого компонента. Этот будет иметь приоритет перед@ManagedBean
.faces-config.xml
Начиная с JSF 2.0 регистрировать управляемый компонент не требуется, просто удалите его./META-INF/faces-config.xml
. См. Также Как ссылаться на управляемые компоненты JSF, которые содержатся в файле JAR?Если вы на самом деле используете jurassic JSF 1.x и не можете выполнить обновление, вам необходимо зарегистрировать компонент через
<managed-bean>
infaces-config.xml
вместо@ManagedBean
. Не забудьте исправить путь сборки проекта как таковой, чтобы у вас больше не было библиотек JSF 2.x (чтобы@ManagedBean
аннотация не могла успешно компилироваться).Если это CDI, который управляет bean-компонентом через
@Named
, вам необходимо убедиться в следующем:CDI 1.0 (Java EE 6) требует
/WEB-INF/beans.xml
файла для включения CDI в WAR. Он может быть пустым или иметь только следующее содержимое: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"
set (по умолчаниюbean-discovery-mode="annotated"
).При использовании CDI 1.1+ с
bean-discovery-mode="annotated"
(по умолчанию) убедитесь, что вы случайно не импортировали область JSF, например,javax.faces.bean.RequestScoped
вместо области CDIjavax.enterprise.context.RequestScoped
. Будьте осторожны с автозаполнением IDE.bean-discovery-mode="annotated"
(по умолчанию) вам необходимо обновить Mojarra до 2.3.3 или новее из-за ошибки . В случае , если вы не можете обновить, то вам нужно либо наборbean-discovery-mode="all"
вbeans.xml
, или поставить JSF 2.3 конкретную@FacesConfig
аннотацию произвольного класса в WAR ( как правило , своего рода приложением запуска класс область действия).Если вы упаковываете bean-компоненты, управляемые CDI, для представлений JSF в JAR, убедитесь, что JAR имеет по крайней мере действительный
/META-INF/beans.xml
(который можно оставить пустым).Если это Spring, которая управляет bean-компонентом через
@Component
, вам необходимо убедиться в следующем:Spring устанавливается и интегрируется в соответствии с его документацией . Что немаловажно, вам нужно как минимум это иметь
web.xml
:И это в
faces-config.xml
:(Выше все, что я знаю о Spring - я не использую Spring - не стесняйтесь редактировать / комментировать другие возможные причины, связанные с Spring; например, некоторые проблемы, связанные с конфигурацией XML)
В случае , если это компонент ретранслятора , который управляет (вложенным) бобом через его
var
атрибут (например<h:dataTable var="item">
,<ui:repeat var="item">
,<p:tabView var="item">
и т.д.) , и вы на самом деле получили «Target недостижима, идентификатор„элемент“решил нуль», то вам необходимо убедиться в следующем :#{item}
Не упоминается вbinding
attribtue любого дочернего компонента. Это неверно, посколькуbinding
атрибут запускается во время построения представления, а не во время визуализации представления. Более того, физически в дереве компонентов есть только один компонент, который просто повторно используется во время каждой итерации. Другими словами, вы действительно должны использоватьbinding="#{bean.component}"
вместоbinding="#{item.component}"
. Но гораздо лучше вообще избавиться от связывания компонентов с bean-компонентом и изучить / задать вопрос о подходящем подходе к проблеме, которую вы думали решить таким образом. См. Также Как работает атрибут «привязка» в JSF? Когда и как его использовать?1б. Какое имя (по умолчанию) управляемого bean-компонента?
Вторым шагом будет проверка имени зарегистрированного управляемого компонента. Соглашения об использовании JSF и Spring соответствуют спецификации JavaBeans, в то время как CDI имеет исключения в зависимости от имп / версии CDI.
FooBean
Класс поддержки боба , как показано ниже,будет во всех средах управления компонентами иметь имя управляемого компонента по умолчанию
#{fooBean}
в соответствии со спецификацией JavaBeans.FOOBean
Класс поддержки боба , как показано ниже,чье неквалифицированное имя класса начинается, по крайней мере, с двух заглавных букв, будет в JSF и Spring иметь имя управляемого компонента по умолчанию, точно совпадающее с неквалифицированным именем класса
#{FOOBean}
, также соответствует спецификации JavaBeans. В CDI это также относится к версиям Weld, выпущенным до июня 2015 года, но не к версиям Weld, выпущенным после июня 2015 года (2.2.14 / 2.3.0.B1 / 3.0.0.A9), или к OpenWebBeans из-за недосмотра в CDI spec . В этих версиях Weld и во всех версиях OWB только первый символ в нижнем регистре#{fOOBean}
.Если вы явно указали имя управляемого bean-компонента,
foo
как показано ниже,или, что эквивалентно с
@ManagedBean(name="foo")
или@Component("foo")
, тогда он будет доступен только от,#{foo}
а не от#{fooBean}
.1c. Где бин-класс поддержки?
Третий шаг - это двойная проверка, находится ли поддерживающий класс bean-компонента в нужном месте в созданном и развернутом WAR-файле. Убедитесь, что вы правильно выполнили полную очистку, перестройку, повторное развертывание и перезапуск проекта и сервера, на случай, если вы действительно были заняты написанием кода и нетерпеливым нажатием F5 в браузере. Если все еще напрасно, позвольте системе сборки создать файл WAR, который затем извлеките и изучите с помощью инструмента ZIP. Скомпилированный
.class
файл класса вспомогательного компонента должен находиться в его структуре пакета в формате/WEB-INF/classes
. Или, когда он упакован как часть модуля JAR, JAR, содержащий скомпилированный.class
файл, должен находиться в нем,/WEB-INF/lib
а не, например, в EAR/lib
или в другом месте.Если вы используете Eclipse, убедитесь, что класс вспомогательного bean-компонента включен,
src
а значит, нетWebContent
, и убедитесь, что включен Project> Build Automatically . Если вы используете Maven, убедитесь, что поддерживающий класс bean-компонента находится внутри,src/main/java
а не вsrc/main/resources
илиsrc/main/webapp
.Если вы упаковываете веб-приложение как часть EAR с EJB + WAR (s), то вам необходимо убедиться, что классы вспомогательных компонентов находятся в модуле WAR, а, следовательно, не в модуле EAR или модуле EJB. Бизнес-уровень (EJB) должен быть свободен от каких-либо артефактов, связанных с веб-уровнем (WAR), чтобы бизнес-уровень можно было повторно использовать на нескольких разных веб-уровнях (JSF, JAX-RS, JSP / Servlet и т. Д.).
2. Target Unreachable, 'entity' вернул null
Это сводится к тому , что вложенной собственности
entity
как в#{bean.entity.property}
вернулсяnull
. Обычно это проявляется только тогда, когда JSF необходимо установить значениеproperty
через компонент ввода, как показано ниже, в то время как#{bean.entity}
фактически возвращаетсяnull
.Вы должны убедиться , что вы подготовили модель объект заранее в
@PostConstruct
, или<f:viewAction>
метод, или , возможно,add()
метод действия в случае , если вы работаете со списками CRUD и / или диалоговые окна на ту же точку зрения.Что касается важности
@PostConstruct
; выполнение этого в обычном конструкторе приведет к сбою, если вы используете структуру управления компонентами, которая использует прокси , такие как CDI. Всегда используйте@PostConstruct
для подключения к инициализации экземпляра управляемого компонента (и@PreDestroy
для подключения к уничтожению экземпляра управляемого компонента). Кроме того, в конструкторе у вас еще не будет доступа ни к каким внедренным зависимостям, см. Также исключение NullPointerException при попытке доступа к @Inject bean в конструкторе .В случае, если
entityId
поставляется через<f:viewParam>
, вам нужно будет использовать<f:viewAction>
вместо@PostConstruct
. См. Также Когда использовать f: viewAction / preRenderView по сравнению с PostConstruct?Вам также необходимо убедиться, что вы сохраняете немодель
null
во время обратной передачи, если вы создаете ее только вadd()
методе действия. Проще всего было бы поместить компонент в область просмотра. См. Также Как выбрать правильную область применения фасоли?3. Target Unreachable, "null" вернул null.
Фактически это имеет ту же причину, что и № 2, только используемая (более старая) реализация EL несколько ошибочна в сохранении имени свойства для отображения в сообщении об исключении, которое в конечном итоге неправильно отображается как «null». Это только немного усложняет отладку и исправление, когда у вас довольно много таких вложенных свойств
#{bean.entity.subentity.subsubentity.property}
.Решение остается тем же: убедитесь, что рассматриваемая вложенная сущность отсутствует
null
на всех уровнях.4. Target Unreachable, «0» вернул null.
Это также имеет ту же причину, что и №2, только используемая (более старая) реализация EL содержит ошибки при формулировании сообщения об исключении. Это проявляется только тогда, когда вы используете нотацию фигурных скобок
[]
в EL, например,#{bean.collection[index]}
когда#{bean.collection}
сам по себе не равен нулю, но элемент по указанному индексу не существует. Такое сообщение следует интерпретировать как:Решение также такое же, как и №2: убедитесь, что предмет коллекции доступен.
5. Target Unreachable, BracketSuffix вернул null.
Фактически это имеет ту же причину, что и # 4, только используемая (более старая) реализация EL несколько ошибочна в сохранении индекса итерации для отображения в сообщении об исключении, которое в конечном итоге неправильно отображается как 'BracketSuffix', что на самом деле является символом
]
. Это только немного усложняет отладку и исправление, когда в коллекции несколько элементов.Другие возможные причины
javax.el.PropertyNotFoundException
:источник
#{bean.entity.property}
Выводит значение, но<p:selectBooleanCheckbox value="#{bean.entity.property}"/>
не работает. У моего логического значения есть сеттер. Целочисленное свойство той же сущности действительно работает при использовании в поле ввода. Любые идеи?Target Unreachable, identifier 'bean' resolved to null
В многомодульных проектах maven (содержащих модули для ejb, web, ear) убедитесь, что ваш веб-модуль объявляет зависимость от вашего ejb-модуля. Без этого@ManagedBean
не может быть разрешено с помощью JSF2.0, и вы должны объявить их вfaces-config.xml
. Около двух часов я заметил, что я не заявлял о необходимости включать ejb в свой веб-модуль (в моем ухе были только ejb и web)@ManagedBean
классы, в первую очередь не относятся к уровню обслуживания (проекту EJB). См. Также stackoverflow.com/questions/13011392/jsf-service-layerДля тех, кто еще застрял ...
При использовании NetBeans 8.1 и GlassFish 4.1 с CDI по какой-то причине у меня возникла эта проблема только локально, а не на удаленном сервере. В чем фокус:
-> с использованием javaee-web-api 7.0 вместо версии pom по умолчанию, предоставляемой NetBeans, то есть javaee-web-api 6.0, поэтому:
-> загрузите этот javaee-web-api-7.0.jar как lib на сервер (папка lib в папке domain1) и перезапустите сервер.
источник
Я решил поделиться своими выводами об этой ошибке после того, как решил ее сам.
Прежде всего, следует серьезно отнестись к решениям BalusC, но есть еще одна вероятная проблема в Netbeans, о которой следует помнить, особенно при создании проекта корпоративного приложения (EAR) с использованием Maven.
Netbeans генерирует, а POM файл родительского , в проект 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 или 1,7, в зависимости от того, что вы предпочитаете, чтобы ваш проект был совместим с CDI, а « Кодировка » - в UTF-8.
Сделайте то же самое для всех других подпроектов (EAR, EJB, WAR), если они еще не совместимы. Запустите свой проект, и вы больше не получите эту ошибку.
Я надеюсь, что это поможет кому-то с подобной ошибкой.
источник
Я решил поделиться своим решением, потому что, хотя многие ответы, представленные здесь, были полезны, у меня все еще была эта проблема. В моем случае я использую JSF 2.3, jdk10, jee8, cdi 2.0 для своего нового проекта, и я запустил свое приложение на wildfly 12, запустив сервер с параметром standalone.sh -Dee8.preview.mode = true, как рекомендовано на веб-сайте wildfly , После загрузки wildfly 13 проблема с «bean resolved to null» исчезла. После загрузки точно такой же войны в wildfly 13 все заработало.
источник
Я застрял на этой ошибке, потому что в классе, который имеет,
@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")
Я решил поделиться своим решением, потому что, хотя правильный ответ очень исчерпывающий, он не покрывает эту (идиотскую) ошибку :)
источник
В моем случае я допустил орфографическую ошибку в @Named ("beanName"), это должно было быть "beanName", но я, например, написал "beanNam".
источник
Я использую wildfly 10 для контейнера javaee. У меня возникла проблема «Target Unreachable, 'entity' return null». Спасибо за предложения BalusC, но моя проблема из объясненных решений. Случайно используя "import com.sun.istack.logging.Logger;" вместо "import org.jboss.logging.Logger;" вызвал CDI, реализовал JSF EL. Надеюсь, это поможет улучшить решение.
источник
У меня такая же проблема. Решение оказалось намного проще. Похоже, что объекту данных нужен метод в форме получателя, то есть getSomeMethod (), а не только someMethod (). В моем случае в таблице данных я вызывал findResults. Я изменил метод в моем вспомогательном компоненте на getFindResults (), и он сработал.
CommandButton работал с поиском без получения, что только усложняло задачу.
источник
Что касается №2, то в моем случае он волшебным образом ожил после замены
пометить с
После того, как я выполнил несколько (более простых, если честно) проектов JSF, я не мог вспомнить, чтобы делал что-то другое, настраивая его сейчас, и впервые получил такую ошибку. Я делал очень простую страницу входа (имя пользователя, пароль, пользовательский компонент ...) и настраивал все как обычно. Единственное различие, которое я заметил, - это вышеупомянутые теги. Может, кому-то это пригодится.
источник
Проблема в моем случае заключалась в том, что я включил конструктор, принимающий параметры, но не пустой конструктор с аннотацией Inject, например.
Я только что протестировал его без конструктора, и это тоже работает.
источник
Для 1. темы ( цель недостижима, идентификатор bean разрешен в нуль );
Я проверил ценные ответы @BalusC и других участников, но я превышаю эту проблему в своем сценарии. После создания нового xhtml с другим именем и создания класса bean-компонента с другим именем я написал (не копируя и вставив) коды шаг за шагом в новый класс bean-компонента и новый файл xhtml.
источник
Когда я удаляю параметр контекста AnnotationConfigWebApplicationContext из файла web.xml Это работа
Если у вас есть подобный параметр, который, как показано ниже, вы должны удалить его из файла web.xml.
источник
Работа с JSF в старом стиле Вы должны определить управляемый компонент в файле beans-config.xml (расположенном в папке WEB-INF) и сделать ссылку на него в файле web.xml следующим образом:
бобы-config.xml
(Я пробовал использовать другие прицелы, но ...)
web.xml
источник
Еще одна подсказка: я использовал JSF и добавил зависимости mvn: com.sun.faces jsf-api 2.2.11
Затем я попытался перейти на Primefaces и добавить зависимость Primefaces:
Я изменил свой xhtml с h: на p:, добавив xmlns: p = "http://primefaces.org/ui в шаблон. Только с JSF проект работал нормально, и управляемый бин был достигнут нормально. Когда я добавляю Primefaces Я получал недостижимый объект (javax.el.propertynotfoundexception). Проблема заключалась в том, что JSF генерировал ManagedBean, а не Primefaces, и я запрашивал простые лица для объекта. Мне пришлось удалить jsf-impl из моего .pom, чистый и установить проект. С этого момента все прошло нормально. Надеюсь, это поможет.
источник
EL интерпретирует $ {bean.propretyName}, как описано - propertyName становится getPropertyName () в предположении, что вы используете явные или неявные методы генерации методов получения / установки.
Вы можете изменить это поведение, явно указав имя как функцию: $ {bean.methodName ()} Это вызывает метод функции Name () напрямую без изменений.
Не всегда верно, что ваши методы доступа называются "get ...".
источник
action="#{bean.property}"
вместоaction="#{bean.method}"
.В моем случае отсутствовал "el-ri-1.0.jar".
источник