Spring管理JSF转换器作为单例

时间:2013-02-10 22:42:13

标签: java spring jsf-2 converter instantiation

我的基于Spring的Web应用程序使用JSF作为表示层。要在我的支持bean中使用Spring @Autowired注释并拥有一个干净的项目结构,我使用任何JSF管理的bean,转换器或验证器。我的所有bean都有一个带有特定属性的@Component@Scope注释。

问题:

我的一个转换器使用数据库,其EntityManager应通过@Autowired注入。 我发现,转换器是由Spring正确创建的,但JSF也管理它! JSF创建自己的转换器实例并使用它们而不是使用Spring创建的实例。

注意:

我通过EL评估引用转换器:<f:converter binding="#{myConverter}"/>

环境:

我的环境是Oracle JDK 6,64b Linux OS,com.sun JSF 2.1实现,Spring 3.1.3。

的问题:

  1. 为什么JSF在我通过#{myConverter}
  2. 引用时会创建自己的转换器实例
  3. JSF如何找出转换器类,因为我没有使用@FacesConverterfaces-config.xml中没有定义它?
  4. 有没有办法强制JSF只使用Spring管理的实例?

  5. 要重现的代码:

    MyConverter.java

    @Scope( "singleton" )
    @Component( "myConverter" )
    public class MyConverter implements Converter {
    
        private MyBean bean;
    
        public MyConverter() {
            System.out.println( "MyConverter created with no arg constructor" );
        }
    
        @Autowired
        public MyConverter( MyBean bean ) {
            System.out.println( "MyConverter created with parametrized constructor" );
            this.bean = bean;
        }
    
        @Override
        public Object getAsObject( FacesContext context, UIComponent component, String value ) {
            System.out.println( "Bean value is " + bean );
            return value;
        }
    
        @Override
        public String getAsString( FacesContext context, UIComponent component, Object value ) {
            System.out.println( "Bean value is " + bean );
            return value.toString();
        }
    }
    

    JSF index.xhtml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core">
    
    <h:body>
    
        <h:form>
    
            <h:inputText value="#{myBean.text}">
                <f:converter binding="#{myConverter}"/>
            </h:inputText>
    
            <h:commandButton value="Create" action="#{myBean.action}"/>
    
        </h:form>
    
    </h:body>
    
    </html>
    

0 个答案:

没有答案