2016-07-10 3 views
1

JSF 2.2로 스프링 부트를 사용한다. 내 문제는 javax.annotation.ManagedBean에서 @ManagedBean을 만들 수 있으며 앱을 실행할 때 내 index.xhtml에서 작동하지만, 사용하고자하는 경우 javax.faces.bean.ManagedBean이 값을 표시하지 않는다는 것입니다. 이 둘의 차이점은 무엇입니까? javax.faces.bean.ManagedBean을 사용할 수없는 이유는 무엇입니까? (web.xml 파일이 없습니다. 모두 클래스로 구성되어 있습니다.)스프링 부트로 JSF 관리 빈 어노테이션 통합하기

답변

4

javax.annotation.* 주석은 고전 JSF 주석에서 CDI 방식으로 이동하기위한 것입니다. Spring Framework는 CDI 어노테이션을 읽을 수있는 능력을 가지고 있기 때문에이 어노테이션이 "작동"하는 이유가 될 수 있습니다. 그러나 CDI의 추세는 전체적으로 @Named을 사용하는 것입니다.

스프링 부트 응용 프로그램에서는 JSF가 아닌 주석을 스캔하는 스프링을 사용합니다. 따라서 응용 프로그램이 @ManagedBean으로 작동한다고 생각할 수도 있습니다. @*Scoped 주석은 쓸모가 없습니다. 생성 된 모든 bean이 Singletons가되어 Spring의 기본 범위가됩니다.

결국 내가 선택한 것은 바닐라 스프링 주석과 범위를 사용하는 것이 었습니다. Spring은 JSF 뷰 범위가 없으므로, custom scope을 에뮬레이션한다.

MyBean.java :

@Component 
@Scope("view") 
public class MyBean { 
    //Here it goes your logic 
} 

ViewScope.java : 잊지 마세요, 마지막으로

@Bean 
public static CustomScopeConfigurer viewScope() { 
    CustomScopeConfigurer configurer = new CustomScopeConfigurer(); 
    configurer.setScopes(
      new ImmutableMap.Builder<String, Object>().put("view", new ViewScope()).build()); 
    return configurer; 
} 

:

public class ViewScope implements Scope { 

    @Override 
    public Object get(String name, ObjectFactory<?> objectFactory) { 
     Map<String, Object> viewMap = FacesContext.getCurrentInstance().getViewRoot().getViewMap(); 
     if (viewMap.containsKey(name)) { 
      return viewMap.get(name); 
     } else { 
      Object object = objectFactory.getObject(); 
      viewMap.put(name, object); 

      return object; 
     } 
    } 

    @Override 
    public String getConversationId() { 
     return null; 
    } 

    @Override 
    public void registerDestructionCallback(String arg0, Runnable arg1) { 

    } 

    @Override 
    public Object remove(String name) { 
     return FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(name); 
    } 

    @Override 
    public Object resolveContextualObject(String arg0) { 
     return null; 
    } 

} 

CustomScopeConfigurer과 뷰 범위를 등록EL 표현식을 통해 봄 콩 사용할 수 있도록 당신의 얼굴-Config.xml의 봄 EL 해결 프로그램을 추가 :

<application> 
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
</application> 

항목 :

관련 문제