繁体   English   中英

将JSF托管的bean注释与Spring Boot集成

[英]Integrating JSF managed bean annotations with Spring Boot

我在JSF 2.2中使用Spring Boot。 我的问题是我可以从javax.annotation.ManagedBean创建@ManagedBean ,当我运行该应用程序时,但在我想使用javax.faces.bean.ManagedBean它无法在index.xhtml中显示。 两者之间有什么区别? 为什么我不能使用javax.faces.bean.ManagedBean (我没有web.xml文件,所有文件都在类中配置)

javax.annotation.*注释旨在从经典的JSF注释过渡到CDI方法。 Spring框架具有读取某些CDI注释的能力,因此这可能是此注释“起作用”的原因。 但是,总体而言,CDI的趋势是使用@Named

在Spring Boot应用程序中,它是Spring扫描注释的文件,而不是JSF。 因此,即使您可能认为该应用程序也可以使用@ManagedBean ,您也会看到@*Scoped批注是无用的,因为所有创建的bean都是单例,这是Spring的默认范围。

最后,我做出的选择是使用香草Spring批注和范围。 由于Spring缺少JSF视图范围,因此还需要一个自定义范围来模拟它。

MyBean.java:

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

ViewScope.java:

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注册视图范围:

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

最后,不要忘记在您的faces-config.xml中添加Spring EL解析器,以使Spring Bean可通过EL表达式使用:

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

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM