복붙노트

[SPRING] JSF 요청시 @ManagedBean @Component 클래스의 @ Autowired 서비스가 null입니다. [duplicate]

SPRING

JSF 요청시 @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. ==============================

    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. ==============================

    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. ==============================

    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 {
        ......
    }
    
  4. 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