3

我正在试验 JSF 和 Primefaces(JSF 2.0.2,PrimeFaces 3.0.5,Spring 3.0.0)。看来我无法从 xhtml 页面访问托管 bean,例如

<h:inputText  id="lastName" value="#{personalBean.personal_Basic.firstName}"  label="Last Name"  required="true" />

请求从命令链接对 bean 方法、服务的调用开始,并返回页面。我可以在服务器控制台 Bean 中看到,服务方法被执行。当我尝试使用上述 bean 属性时,我什么也没看到。但是,我能够访问用于用户会话管理的会话范围 bean。

对不起,如果这个问题太天真了。非常感谢任何解决问题的意见。

下面是我的代码片段。这就是我所说的bean:

<h:form>
    <p:commandLink id="ajax" actionListener="#{personalBean.getPersonalInfo}" style="margin-left:5px;">  
        <h:outputText value="Personal Info" />  <br/>
    </p:commandLink>  
</h:form>

下面是请求范围的托管 bean。

package com.test.model;
@ManagedBean
@Scope("request")
public class PersonalBean  implements Serializable {

private static final long serialVersionUID = 199L;
private Personal_Basic personal_Basic;
private IPersonalService personalService;

@Inject
public PersonalBean(final IPersonalService personalService) {
    this.personalService = personalService;
}
public String getPersonalInfo() {
    System.out.println("\n\nPersonalBean#getPersonalInfo called...**");
    User user = null;
    Personal_Basic personal_Basic = personalService.getPersonalBasic();
    this.setPersonal_Basic(personal_Basic);
    System.out.println("personal_Basic data:"+personal_Basic);
    System.out.println("PersonalBean#getPersonalInfo ended...");
    return "/page/personal.html";
}
// Getters/setters for class members followed
}

PersonalService 实现使用@Service 进行注释。

下面是 spring 配置 xml 的摘录。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <context:annotation-config/> 
    <context:component-scan base-package="com.test"/>
...................
...................
</beans>

以下是 faces-config.xml 的摘录

<?xml version="1.0"?>
<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">
  <application>
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
        <resource-bundle>
            <base-name>Messages</base-name>
            <var>msg</var>
        </resource-bundle>
        <locale-config>
            <default-locale>en</default-locale>
        </locale-config>
  </application>
...........................
</faces-config>
4

2 回答 2

4

默认情况下,该<context:component-scan base-package="com.test"/>元素扫描并注册使用@Component、@Repository、@Service 或@Controller 注释的所有bean。

Spring 还提供对javax.annotation.ManagedBean(not javax.faces.bean.ManagedBean) 和 JSR-330 标准注解的支持,Spring 也会扫描这些注解,但您需要将以下依赖项添加到您的项目中。

<dependency>
    <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    <version>1</version>
</dependency>

您可以在此处查看 Spring 注释的所有等效注释,因为您可以看到 @Component 的等效项是 @Named 并且对于范围使用 Springs @Scope 注释而不是javax.inject.scope如上所述。因此,如果您希望Spring 管理应用程序中的所有 bean,您可以使用@Component,@Namedjavax.annotation.ManagedBean注解并使用 @Autowired 或 @Inject 注入它们。

对于您的问题,为什么注释的 beanjavax.faces.bean.ManagedBean似乎已初始化但不起作用是因为正如 @BalusC 所述,JSF 不支持 @Inject 您必须使用 @ManagedProperty 注释。

关于如何与 Spring 和 JSF 一起工作的一些背景知识:

实际上,当应用程序启动时,您的应用程序中现在有两个带有 JSF 和 Spring 的 IOC 容器。首先,在 faces-config.xml 中配置的 org.springframework.web.jsf.el.SpringBeanFacesELResolver 委托给 Spring 根 WebApplicationContext,首先解析对 Spring 定义的 beans 的名称引用,然后是底层 JSF 实现的默认解析器。

现在,当第一次查找 JSF bean 时,它会被构造,然后通过 setter 方法设置托管属性,因此您可以使用 @ManagedProperty 注释注入 Spring bean,如下所示:

package com.test.model;
@ManagedBean
@RequestScoped
public class PersonalBean  implements Serializable {
@ManagedProperty(value="#{personalService}")
private IPersonalService personalService;
public IPersonalService getPersonalService() {
    return personalService;
}

public void setPersonalService(IPersonalService personalService) {
    this.personalService= personalService;
}

或者您也可以使用手动获取 Spring bean

org.springframework.web.context.support.WebApplicationContextUtils像这样:

private Object getSpringBean(String name){
        WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(
                (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext());
        return ctx.getBean(name);
}

并像这样使用它:

Personal_Basic personal_Basic = ((IPersonalService) getSpringBean("personalService")).getPersonalBasic();

但是,您可以使用 Spring 容器通过使用 @Component 注释 JSF bean 来管理所有 bean,而不是在您的应用程序中使用两个容器,并且没有任何含义,我知道并且应该完全可以使用 Spring 注释。

也可以看看:

于 2012-09-18T14:40:05.387 回答
0

您不能将@ManagedBean 与弹簧范围混合,您必须在@ManagedBean 和@RequestScope 或@Componenet 和@Scope("session") 之间进行选择

于 2016-02-04T13:34:40.383 回答