[SPRING] JSF 요청시 @ManagedBean @Component 클래스의 @ Autowired 서비스가 null입니다. [duplicate]
SPRINGJSF 요청시 @ManagedBean @Component 클래스의 @ Autowired 서비스가 null입니다. [duplicate]
나는 JSF 2와 함께 Spring 3 (MVC)을 시도했다. 나는 Spring과 JSF에서 약간의 경험을했지만, 전에는 참여하지 않았다. 결국 나는 2 개의 파일을 가지고있다.
@ManagedBean(name = "userBean")
@Scope
@Component
public class someBean {
@Autowired
private TestService testService;
public void printString() {
System.out.println(testService.getString());
}
}
과
@ManagedBean(name = "studentBean")
@Scope
@Component
public class StudentBean {
@Autowired
private TestService testService;
public void printString() {
System.out.println(testService.getString());
}
}
이 파일에는 spring, jsf 및 web.xml에 대한 올바른 구성이 있습니다. 그리고 .xhtml 페이지에서 'someBean'과 'StudentBean'에 대해 printString ()을 시작하십시오. 두 번째 경우에는 NPE가 첫 번째 경우에 있고 'some string'이 콘솔에 있습니다. 그 이유는 간단합니다. Spring 컨텍스트와 JSF의 다른 bean 이름. 모든 문제는 이후에 끝났다.
@Component => @Component("userBean")
public class someBean {
디버그에서 나는 그것을 보았다.
private TestService testService;
@Autowired
public void setTestService(TestService testservice) {
this.testService = testService;
}
JSF 빈을 생성 할 때 testService가 null이 아닌 값을 설정하지만 JSF 라이프 사이클 중에 null 인 경우
public void pringString() {
testService.blah();
}
testService가 null입니다. 그것은 내가 이해할 수없는 것이다. 이 상황을 자세히 설명하기 위해 Spring과 JSF에 깊은 지식이 있습니까?
해결법
-
==============================
1.JSF와 Spring은 모두 빈 컨테이너로 작동 할 수 있습니다. @ManagedBean 어노테이션은 JSF 관리 Bean 기능에 클래스의 새 인스턴스를 작성하고 주어진 이름으로 관리하도록 지시합니다. @Component 어노테이션은 클래스의 새로운 인스턴스를 생성하고 주어진 이름으로 관리하도록 Spring ApplicationContext에 지시한다. 즉, JSF와 Spring은 모두 해당 클래스의 인스턴스를 만들고, JSF는 EL을 통해 접근 할 수 있지만, Spring은 해당 종속성을 주입한다 (스프링 주석이므로 @Autowired는 JSF 관리 Bean 기능에 의해 이해되지 않는다) .
JSF와 Spring은 모두 빈 컨테이너로 작동 할 수 있습니다. @ManagedBean 어노테이션은 JSF 관리 Bean 기능에 클래스의 새 인스턴스를 작성하고 주어진 이름으로 관리하도록 지시합니다. @Component 어노테이션은 클래스의 새로운 인스턴스를 생성하고 주어진 이름으로 관리하도록 Spring ApplicationContext에 지시한다. 즉, JSF와 Spring은 모두 해당 클래스의 인스턴스를 만들고, JSF는 EL을 통해 접근 할 수 있지만, Spring은 해당 종속성을 주입한다 (스프링 주석이므로 @Autowired는 JSF 관리 Bean 기능에 의해 이해되지 않는다) .
그래서 선택의 여지가 있습니다 : 모든 것에 JSF 관리 빈을 사용합니다 (다소 제한적이므로 권장하지는 않습니다), 모든 것에 CDI를 사용합니다 (옵션이지만 Spring을 사용하지 않습니다). 또는 모든 것에 대해 Spring을 사용합니다 (보통은) @ManagedBean 주석을 제거하고, faces-config.xml에 SpringBeanFacesELResolver를 등록하여 EL을 통해 Spring 빈에 액세스 할 수있게 만든다. Spring 레퍼런스 매뉴얼은 이것을 19.3.1 절에서 설명한다.
-
==============================
2.나는 같은 문제를 가지고 있었는데, 그것은 @ManagedBean annotation의 속성 이름 때문이었다. 내 백킹 빈은 다음과 같다.
나는 같은 문제를 가지고 있었는데, 그것은 @ManagedBean annotation의 속성 이름 때문이었다. 내 백킹 빈은 다음과 같다.
@Component @ManagedBean(name="mainBean") @SessionScoped public class MainManagedBean{...}
보시다시피 bean (mainBean)에 부여 된 이름은 backing bean이 가져야하는 기본 이름 (mainManagedBean)과 다릅니다.
나는 "mainManagedBean"속성 이름을 설정하여 문제를 해결했습니다. 내 콩은 이렇게됩니다 :
@Component @ManagedBean(name="mainManagedBean") @SessionScoped public class MainManagedBean{...}
이게 너를 도울 수 있으면 좋겠다.
-
==============================
3.testService가 null 인 이유는 관리 Bean을 구성 할 때 testService가 아직 인스턴스화되지 않았기 때문입니다. 그래서 @PostConstruct를 사용하여 스프링 빈을 관리 빈에 삽입 할 수있다.
testService가 null 인 이유는 관리 Bean을 구성 할 때 testService가 아직 인스턴스화되지 않았기 때문입니다. 그래서 @PostConstruct를 사용하여 스프링 빈을 관리 빈에 삽입 할 수있다.
@ManagedBean(name = "userBean") @Scope @Component public class someBean { @Autowired private TestService testService; public void printString() { System.out.println(testService.getString()); } @PostConstruct private void init() { ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); ServletContext servletContext = (ServletContext) externalContext.getContext(); WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext). getAutowireCapableBeanFactory(). autowireBean(this); } } @Service public class TestService { ...... }
from https://stackoverflow.com/questions/28421777/autowired-service-inside-a-managedbean-component-class-is-null-during-jsf-req by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 3 보안을 사용하여 jsp 페이지에서 내 사용자 정의 사용자 객체에 액세스하기 (0) | 2019.05.10 |
---|---|
[SPRING] Spring MVC에서 커스텀 MediaType을 어떻게 설정 하는가? (0) | 2019.05.10 |
[SPRING] JUnit5의 @Nested 클래스에서 테스트 롤백이 작동하지 않습니다. (0) | 2019.05.10 |
[SPRING] 원인 : java.lang.ClassNotFoundException : org.elasticsearch.transport.Netty3Plugin (0) | 2019.05.10 |
[SPRING] JQuery 파일 업로드는 각 게시물 요청의 각 파일을 보냅니 까? (0) | 2019.05.09 |