javax.el.PropertyNotFoundException 노출 및 해결 : 도달 할 수없는 대상
EL에서 관리 Bean을 참조 #{bean.entity.property}
하려고 할 때 가끔 javax.el.PropertyNotFoundException: Target Unreachable
Bean 특성이 설정되거나 Bean 조치가 호출 될 때 예외가 발생합니다.
다섯 가지 종류의 메시지가있는 것 가변.
- 딱 수없는 대상, ID 'bean'이 널로 분석했습니다.
- 딱 수없는 대상입니다. 'entity'가 널을 리턴했습니다.
- 딱 수없는 대상입니다. 'null'이 null을 반환했습니다.
- ''0 ''이 (가) null을 반환 함
- 딱 수없는 대상입니다. 'BracketSuffix'가 널을 리턴했습니다.
무엇을 의미합니까? 어떻게 발생하며 어떻게 해결해야합니까?
1. 딱 수없는 대상, 식별자 'bean'이 null로 확인되었습니다.
이 관리 Bean 인스턴스 자체가 EL에서 해당 식별자 (Bean 이름)로 명확하게 수 #{bean}
있습니다.
원인을 발견하는 것은 세 단계로 나눌 수 있습니다.
ㅏ. 누가 콩을 관리하고 있습니까?
비. (기본) 관리 Bean 이름은 무엇입니까?
씨. 백킹 빈 클래스는 어디에 있습니까?
1a. 누가 콩을 관리하고 있습니까?
첫 번째 단계는 Bean 인스턴스 관리를 담당하는 Bean 관리 프레임 워크를 확인하는 것입니다. 그것은 JSF 를 통해 인가 ? 아니면 CDI 를 통해 ? 아니면 봄을 통해 입니까? 동일한 백킹 Bean에서 여러 Bean 관리 프레임 워크 클래스 어노테이션을 혼합하지 않을 수 있습니까? 예 : 또는 , 또는 . 이것은 잘못이다. Bean은 최대 하나의 Bean 관리 프레임 워크에서 관리해야하며 해당 프레임 워크가 구성되어 있어야합니다. 어떤 것을 선택 해야할지 모르는 경우 Backing Beans (@ManagedBean) 또는 CDI Beans (@Named)로 이동합니다. 그리고 봄 JSF 통합 : JSF는 빈 관리에 어떻게 봄의 구성 요소 / 서비스를 제공하는 방법?@ManagedBean
@Named
@Component
@Named @Component
@Named @ManagedBean
@ManagedBean @Component
를 통해 Bean을 관리하는 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
대신 실수로 가져 오십시오 . IDE 자동 완성 기능을 생 보면 Eclipse는 목록의 첫 번째 항목으로 잘못된 항목을 자동 제안합니다.javax.faces.bean.ManagedBean
- 다른 관리 Bean 이름과 함께 매우 동일한 지원 Bean 클래스 에서
@ManagedBean
JSF 1.x 스타일<managed-bean>
항목으로 대체하지 않습니다faces-config.xml
. 이것보다 우선합니다@ManagedBean
.faces-config.xml
JSF 2.0부터 관리 Bean을 등록 할 필요 가 없습니다. 제거하십시오. - 런타임 클래스 경로는 깨끗하고 JSF API 여러 JSF 구현 (Mojarra 및 MyFaces)을 혼합하지 않습니다. 컨테이너 컨테이너가 이미 상자에 JSF API를 사용하는 다른 대상이되는 경우 webapp와 함께 JSF 또는 Java EE API JAR 파일을 제공하지 않습니다. 참조 : 우리의 JSF 위키 페이지의 "설치 JSF"섹션 JSF 설치 지침. 컨테이너 자체가 아닌 WAR에서 컨테이너 라이선스 JSF를 업그레이드하려는 경우 대상 컨테이너에 WAR 라이선스를 사용하도록 지시했습니다.
- JAR에 JSF 관리 Bean을 패키징하는 경우 JAR에 JSF 2.0 호환이 있는지 확인하십시오
/META-INF/faces-config.xml
. JAR 파일로 제공되는 JSF 관리 Bean을 참조하는 방법 도 참조하십시오. 경우이 실제로 쥬라기 JSF 1.x에서에서를 사용하여, 당신은 업그레이드 할 수 없습니다,은을 통해 당신 빈을 등록해야 우리합니다
<managed-bean>
으로faces-config.xml
대신@ManagedBean
. JSF 2.X가 더 이상 라이브러리 없으므로@ManagedBean
주석이 혼란스럽게 컴파일되지 않도록 프로젝트 빌드 경로를 수정하는 것을 잊지 마십시오 .
를 통해 Bean을 관리하는 CDI 인 경우 @Named
다음을 확인해야합니다.
/WEB-INF/beans.xml
WAR에서 CDI를 사용 하면 CDI 1.0 (Java EE 6)에 파일이 필요 합니다 . 그것은 할 수 비우 아니면 그냥 다음과 같은 내용을 수 있습니다. :<?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 (자바 EE 7) 어떤없이
beans.xml
, 또는 빈beans.xml
파일, 또는 호환 CDI 1.0 위의와beans.xml
CDI 1.0과 동일하게 동작합니다. CDI 1.1 호환있을 때beans.xml
명시 적으로version="1.1"
, 그것은 기본적으로 만 등록합니다@Named
콩 과 같은 명시 적 CDI 범위 주석 , , , , 등의 경우 당신은 심지어 명시하지 않고 , CDI는 콩을 관리하는 모든 콩을 등록하려는 CDI 범위 아래의 CDI 1.1과 호환 되는 세트를 사용하십시오 .@RequestScoped
@ViewScoped
@SessionScoped
@ApplicationScoped
/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
bean-discovery-mode="annotated"
1.1+ 를 (공학) 과 함께 사용 하는 경우 실수 로 CDI 범위 대신 과 같은 JSF 범위 를 가져 오지 갑자기 있는지 확인하십시오 . IDE 자동 완성으로 조심하십시오.javax.faces.bean.RequestScoped
javax.enterprise.context.RequestScoped
- Mojarra 2.3.0-2.3.2 및 CDI
bean-discovery-mode="annotated"
1.1+를 사용하는 경우 버그 로 인해 Mojarra를 2.3.3 이상으로 업그레이드해야합니다 . 경우에 당신은 다음 세트 중 하나를 필요로 업그레이드 할 수 없습니다bean-discovery-mode="all"
에beans.xml
, 또는 JSF 2.3 특정 클래스에 넣어@FacesConfig
(일반적으로 응용 프로그램의 일종이 시작에 범위) 전쟁에서 임의의의 주석을. - Tomcat 및 Jetty와 같은 Java의 EE 컨테이너는 CDI 이외와 함께 제공되지 않습니다. 수동으로 설치해야합니다. 라이브러리 JAR을 추가하는 것보다 약간 더 많은 작업입니다. Tomcat의 경우가 답변의 지시를 따르십시오 . Tomcat에서 CDI를 설치하고 사용하는 방법은 무엇입니까?
- 런타임 클래스 경로가 깨끗하고 CDI API 여러 CDI 구현 (Weld, OpenWebBeans 등)을 혼합하지 않습니다. 컨테이너 컨테이너가 이미 상자에 CDI API를 사용하는 경우 Webapp와 함께 다른 대상을 제공하는 경우 CDI 또는 Java EE API JAR 파일을 제공하지 않습니다.
JAR에서 JSF 용 CDI 관리 Bean을 패키징하는 경우 JAR에 최소한 유효한
/META-INF/beans.xml
(비어있을 수 있습니다) 있는지 확인 .
를 통해 bean을 관리하는 Spring 사용자 인 경우 @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>
(위의 내용은 봄과 관련하여 알고있는 것입니다. 봄을 만들지 않습니다. 다른 가능한 봄 관련 원인으로 편집 / 작성을 작성하십시오. (예 : 일부 XML 구성 관련 문제))
경우는의 리피터 구성 요소 의를 통해 (중첩) 빈을 관리하는 것 var
(예를 들어, 속성 <h:dataTable var="item">
, <ui:repeat var="item">
, <p:tabView var="item">
, 등) 당신이 실제로있어 "대상에 연결할 수는 식별자 '항목에'널 (null)로 해결", 당신 은 다음의 확인 필요 :
은
#{item}
에서 참조되지 않은binding
하위 구성 요소의 속성입니다.binding
뷰 작성 시간이 아닌 뷰 빌드 시간 동안 속성이 실행 문장 시간 . 또한 구성 요소 트리에는 물리적으로 하나의 구성 요소 만 있습니다.이 구성 요소는 모든 반복 라운드 동안에 있습니다. 즉, 대신binding="#{bean.component}"
대신 합니다binding="#{item.component}"
. 그러나 훨씬 더 나은 방법은 구성 요소 빈을 제거하고 해결하는 방법입니다. JSF에서 '바인딩'속성 은 어떻게 작동 중인지?를 참조하십시오 . 언제 어떻게 사용합니까?
1b. (기본) 관리 Bean 이름은 무엇입니까?
두 번째 단계는 등록 된 관리 Bean 이름을 확인하는 것입니다. JSF 및 봄 사용 규칙은 자바 빈즈 스펙 을 준수 하지만 CDI에는 CDI IMPL / 버전에 따라 예외가 있습니다.
FooBean
다음과 같은 백업 빈 클래스,@Named public class FooBean {}
모든 Bean 관리 프레임 워크에서
#{fooBean}
JavaBeans 스펙에 따라 기본 관리 Bean 이름은 입니다.FOOBean
다음과 같은 백업 빈 클래스,@Named public class FOOBean {}
정규화되지 않은 클래스 이름은 JSF에서 두 개 이상의 대문자로 시작하며 Spring은 기본적으로 규정되지 않은 클래스 클래스의 기본 관리 Bean 이름을 준수
#{FOOBean}
합니다. CDI의 경우 2015 년 6 월 이전에 릴리스 된 용접 버전 맞지만 2015 년 6 월 이후에 릴리스 된 용접 버전 (2.2.14 / 2.3.0.B1 / 3.0.0.A9)이나 OpenWebBeans 에서는 감시 기능으로 인해 해당되지 않습니다 . CDI 사양 . 이 용접 버전과 모든 OWB 버전에서는 첫 문자 만 소문자로 표시#{fOOBean}
됩니다.foo
그것 같이 관리 Bean 이름을 명시 적으로도 관리 ,@Named("foo") public class FooBean {}
동등으로 또는
@ManagedBean(name="foo")
또는@Component("foo")
, 단지로 사용할 그것은 수#{foo}
있으므로 하지 에 의해#{fooBean}
.
1c. 백킹 빈 클래스는 어디에 있습니까?
세 번째 단계는 백업 Bean 클래스가 빌드 및 배치 된 WAR 파일의 올바른 위치에 있는지 다시 확인하는 것입니다. 코드 작성에 어려움을 겪고있는 사람 고 브라우저에서 F5 키를 누를 경우 프로젝트와 서버를 완전히 정리하고 재 구축, 재배치 및 재시작해야합니다. 여전히 헛된 경우 빌드 시스템에서 WAR 파일을 생성 한 다음 ZIP 도구로 추출하고 검사하십시오. .class
지원 Bean 클래스 의 된 파일은의 패키지 구조에 있어야합니다 /WEB-INF/classes
. 또는 JAR 모듈의 일부로 패키지 될 때 선택할 .class
파일을 포함 하는 JAR은 /WEB-INF/lib
EAR /lib
또는 다른 곳에 없어야합니다 .
Eclipse를 사용하는 경우 지원 Bean 클래스가 포함 src
되어 있지 WebContent
않은지 확인하고 프로젝트> 자동 빌드 가 사용 가능한지 확인하십시오 . 당신은 메이븐을 사용하는 경우 백업 빈 클래스에 있는지 확인 src/main/java
하여 및 하지 에서 src/main/resources
나 src/main/webapp
.
EJB + WAR을 사용하여 EAR의 일부로 웹 애플리케이션을 패키징하는 경우, 지원 Bean 클래스가 WAR 모듈에있는 EAR 모듈 또는 EJB 모듈에 없는지 확인해야합니다. 비즈니스 계층 (EJB)에는 웹 계층 (WAR) 관련 아티팩트가 없어야 비즈니스 계층이 여러 다른 웹 계층 (JSF, JAX-RS, JSP / Servlet 등)에서 사용할 수 있습니다.
2. Target Unreachable, 'entity'가 null을 반환했습니다.
이것은 return 과 같이 중첩 된 속성 entity
으로 귀결됩니다 . 이것은 일반적으로 JSF가 아래와 같은 입력 구성 요소 를 통해 값 을 설정 해야 할 때만 노출 되지만 실제로 .#{bean.entity.property}
null
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
; CDI와 같은 프록시 를 사용하는 빈 관리 프레임 워크를 사용하는 경우 일반 생성자에서이 작업을 수행하면 실패 합니다. 항상 @PostConstruct
관리 Bean 인스턴스 초기화 @PreDestroy
에 연결 하는 데 사용 하고 관리 Bean 인스턴스 파괴에 연결 하는 데 사용 합니다. 또한 생성자에서는 아직 주입 된 종속성에 액세스 할 수 없습니다 . constructor에서 @Inject bean에 액세스하는 동안 NullPointerException 도 참조하세요 .
entityId
를 통해 제공되는 경우 대신 <f:viewParam>
을 사용해야 <f:viewAction>
합니다 @PostConstruct
. f : viewAction / preRenderView와 PostConstruct를 사용하는 경우를 참조하십시오 .
또한 액션 메서드 null
로만 생성하는 경우 포스트 백 중에 비 모델 을 보존해야합니다 add()
. 가장 쉬운 방법은 뷰 범위에 빈을 넣는 것입니다. 올바른 Bean 범위를 선택하는 방법 도 참조하십시오 .
3. 대상에 연결할 수 없습니다. 'null'이 null을 반환했습니다.
이것은 실제로 # 2와 동일한 원인을 가지고 있으며, 사용되는 (이전) EL 구현 만 예외 메시지에 표시 할 속성 이름을 보존하는 데 다소 버그가 있으며 궁극적으로 'null'로 잘못 노출됩니다. 이렇게하면 중첩 된 속성이 꽤있을 때만 디버깅 및 수정이 조금 더 어려워집니다 #{bean.entity.subentity.subsubentity.property}
.
솔루션은 여전히 동일합니다. 문제의 중첩 엔티티 null
가 모든 수준에서 가 아닌지 확인하십시오 .
4. Target Unreachable, ''0 ''이 (가) null을 반환했습니다.
이것은 또한 # 2와 동일한 원인을 가지고 있으며, 사용되는 (이전) EL 구현 만이 예외 메시지를 공식화하는 데 버그가 있습니다. 당신은 중괄호 표기법을 사용할 때 노출하는 경우에만 []
같이 EL에서를 #{bean.collection[index]}
곳 #{bean.collection}
자체가 null이지만, 지정된 인덱스의 항목이 존재하지 않습니다. 그런 다음 이러한 메시지는 다음과 같이 해석되어야합니다.
대상에 연결할 수 없습니다. 'collection [0]'에서 null을 반환했습니다.
솔루션은 # 2와 동일합니다. 컬렉션 항목을 사용할 수 있는지 확인합니다.
5. Target Unreachable, 'BracketSuffix'가 null을 반환했습니다.
이것은 실제로 # 4와 동일한 원인을 가지고 있으며, 사용되는 (이전) EL 구현 만 예외 메시지에 표시 할 반복 인덱스를 보존하는 데 다소 버그가 있습니다. 이는 궁극적으로 실제로 문자 인 'BracketSuffix'로 잘못 노출됩니다 ]
. 이렇게하면 컬렉션에 여러 항목이있을 때만 디버깅 및 수정이 조금 더 어려워집니다.
기타 가능한 원인 javax.el.PropertyNotFoundException
:
- javax.el.ELException : com.example.Bean 유형에서 'foo'읽기 오류
- javax.el.ELException : com.example.Bean 클래스에서 actionMethod 속성을 찾을 수 없습니다.
- javax.el.PropertyNotFoundException : com.example.Bean 유형에서 'foo'속성을 찾을 수 없습니다.
- javax.el.PropertyNotFoundException : java.lang.Boolean 유형에서 'foo'속성을 읽을 수 없습니다.
- javax.el.PropertyNotFoundException : org.hibernate.collection.internal.PersistentSet 유형에서 속성을 찾을 수 없습니다.
- Outcommented Facelets 코드는 여전히 # {bean.action ()}과 같은 EL 표현식을 호출하고 # {bean.action}에서 javax.el.PropertyNotFoundException을 발생시킵니다.
아직 막혀있는 분들을 위해 ...
NetBeans 8.1 및 GlassFish 4.1을 CDI와 함께 사용하면 어떤 이유로이 문제가 원격 서버가 아닌 로컬에서만 발생했습니다. 트릭은 무엇입니까?
-> NetBeans에서 제공하는 기본 pom 버전 인 javaee-web-api 6.0 대신 javaee-web-api 7.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을 서버 (domain1 폴더의 lib 폴더)에 lib로 업로드하고 서버를 다시 시작합니다.
이 오류를 직접 해결 한 후 발견 한 내용을 공유하기로 결정했습니다.
우선 BalusC 솔루션을 진지하게 받아 들여야하지만 Netbeans에서 Maven을 사용하여 EAR (Enterprise Application Project) 를 구축 할 때 특히 알아야 할 또 다른 문제가 있습니다 .
Netbeans는 상위 POM 파일 , EAR 프로젝트 , EJB 프로젝트 및 WAR 프로젝트를 생성 합니다. 내 프로젝트의 다른 모든 것은 괜찮 았고 GlassFish 4.1에는 Netbeans 8.0에 내장 된 GlassFish 4.1을 만드는 Weld CDI 버그가 있기 때문에 문제가 GlassFish 4.0 (Netbeans에 설치하고 연결해야 함)의 버그라고 거의 가정했습니다. 2 패치를 통하지 않으면 사용할 수 없습니다.
해결책:
결의하려면 "대상에 연결할 수 없음을, 식별자 '콩'null로 해결" 오류 -
I 상위 POM 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택 합니다. 프로젝트 속성 대화 상자가 나타나면 "소스"를 클릭하면 " 소스 / 바이너리 형식 "이 1.5로 설정되고 " 인코딩 "이 Windows 1250으로 설정된 것을 볼 수 있습니다. " 소스 / 바이너리 형식 "을 1.6 0r 1.7로 변경합니다. 프로젝트 CDI를 준수하고 " 인코딩 "을 UTF-8 로 만드는 것을 선호합니다 .
다른 모든 하위 프로젝트 (EAR, EJB, WAR)가 아직 호환되지 않는 경우 동일한 작업을 수행합니다. 프로젝트를 실행하면 해당 오류가 다시 발생하지 않습니다.
나는 이것이 비슷한 오류가있는 누군가에게 도움이되기를 바랍니다.
여기에 제공된 많은 답변이 도움이되었지만 여전히이 문제가 있었기 때문에 솔루션을 공유하기로 결정했습니다. 제 경우에는 새 프로젝트에 JSF 2.3, jdk10, jee8, cdi 2.0을 사용하고 있으며 wildfly 웹 사이트에서 권장하는대로 standalone.sh -Dee8.preview.mode = true 매개 변수로 서버를 시작하여 wildfly 12에서 앱을 실행했습니다. . "bean이 null로 해결됨"문제는 wildfly 13을 다운로드 한 후 사라졌습니다. 정확히 동일한 전쟁을 wildfly 13에 업로드하면 모든 것이 작동했습니다.
제 경우에는 @Named ( "beanName")에서 철자 오류를 범했습니다. "beanName"이라고 가정했지만 예를 들어 "beanNam"을 썼습니다.
javaee 컨테이너에 wildfly 10을 사용하고 있습니다. "Target Unreachable, 'entity'returns null"문제가 발생했습니다. BalusC의 제안에 감사하지만 솔루션 중 내 문제가 설명되었습니다. 실수로 "import com.sun.istack.logging.Logger"사용 "import org.jboss.logging.Logger"대신 CDI가 JSF EL을 구현했습니다. 솔루션 개선에 도움이되기를 바랍니다.
나는 같은 문제가 있었다. 해결책은 훨씬 더 간단하다는 것이 밝혀졌습니다. 데이터 테이블이 getter 형태의 메서드를 원하는 것으로 보입니다. 즉, someMethod ()뿐만 아니라 getSomeMethod ()입니다. 제 경우에는 데이터 테이블에서 findResults를 호출했습니다. 내 백업 빈의 메서드를 getFindResults ()로 변경했고 작동했습니다.
commandButton은 더 혼란스럽게 만들기 위해 제공되는 get없이 find 작업을 수행했습니다.
# 2는 제 경우에는 교체 후 마술처럼
<body>
태그
<h:body>
JSF 프로젝트를 여러 번 수행 한 후 (솔직히 더 간단하게) 지금 설정하는 다른 작업을 수행 한 것을 기억할 수 없었고 처음으로 이런 종류의 오류가 발생했습니다. 나는 매우 기본적인 로그인 페이지 (사용자 이름, 암호, 사용자 Bean ...)를 만들고 평소와 같이 모든 것을 설정했습니다. 내가 발견 한 유일한 차이점은 앞서 언급 한 태그입니다. 누군가 이것이 유용하다고 생각할 수도 있습니다.
제 경우의 문제는 매개 변수를 사용하는 생성자를 포함했지만 Inject 주석과 함께 빈 생성자를 포함하지 않았습니다.
@Inject public VisitorBean() {}
생성자없이 테스트했는데 이것도 작동하는 것 같습니다.
1. 주제의 경우 ( Target Unreachable, 식별자 'bean'이 null로 확인 됨 )
@BalusC와 다른 공유자들의 귀중한 답변을 확인했지만 내 시나리오에서 이와 같은 문제를 초과했습니다. 다른 이름으로 새 xhtml을 만들고 다른 이름으로 빈 클래스를 만든 후 새 빈 클래스와 새 xhtml 파일에 단계별로 코드를 작성했습니다 (복사 붙여 넣기가 아님).
이전 스타일에서 JSF로 작업하기 beans-config.xml 파일 (WEB-INF 폴더에 있음) 에서 관리 Bean을 정의 하고 web.xml 파일 에서 다음과 같이 참조해야합니다 .
beans-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>
또 다른 단서 : 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로 변경하고 Primefaces 종속성을 추가하려고했습니다.
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>6.0</version>
</dependency>
xhtml을 h :에서 p :로 변경하고 xmlns : p = "http://primefaces.org/ui를 템플릿에 추가했습니다. JSF로만 proyect가 정상적으로 실행되고 managedbean에 도달했습니다. Primefaces를 추가 할 때 도달 할 수없는 객체 (javax.el.propertynotfoundexception)가 발생했습니다. 문제는 JSF가 Primefaces가 아닌 ManagedBean을 생성하고 있고 객체에 대한 프라임 페이스를 요청하고 있다는 것입니다. 내 .pom에서 jsf-impl을 삭제해야했습니다. proyect를 설치합니다.이 시점부터 모든 것이 정상적으로 진행되었습니다. 도움이되기를 바랍니다.
EL은 $ {bean.propretyName}을 설명 된대로 해석합니다. getter / setter를 생성하는 명시 적 또는 암시 적 메서드를 사용하고 있다는 가정하에 propertyName은 getPropertyName ()이됩니다.
이름을 함수로 명시 적으로 식별하여이 동작을 재정의 할 수 있습니다. $ {bean.methodName ()} 수정하지 않고 직접 함수 메서드 Name ()을 호출합니다.
접근 자의 이름이 "get ..."인 것은 항상 사실은 아닙니다.
'IT' 카테고리의 다른 글
R을 사용하여 압축 된 데이터 파일 다운로드, 데이터 추출 및 가져 오기 (0) | 2020.07.20 |
---|---|
한 파일에서 다른 파일에있는 행 삭제 (0) | 2020.07.20 |
jQuery를 사용하여 30 분 안에 쿠키를 종료하는 방법은 무엇입니까? (0) | 2020.07.20 |
BASH의 목록에 변수가 있는지 확인하는 방법 (0) | 2020.07.20 |
nodejs 연결은 정적을 수 없습니다 (0) | 2020.07.20 |