我的基于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。
#{myConverter}
@FacesConverter
在faces-config.xml
中没有定义它?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>