如何将Spring 3 Bean注入JSF 2转换器

时间:2011-02-21 18:54:36

标签: spring jsf dependency-injection jsf-2 converter

我正在尝试@javax.naming.Inject一个名为WtvrBean的Spring 3 Bean进入JSF 2 @FacesConverter

Bean和Converter都在同一个包中。而且,在我的spring的applicationContext.xml中,我正在扫描这个包:

<context:component-scan base-package="my-package" />

但这不起作用。当然,使用转换器的JSF 2内部类是 绝对不在my-package

例如,如果我从JSF 2 ManagedBean中删除@ManagedBean,并将其替换为@org.springframework.stereotype.Component@Controller,则WtvrBean可以是@Inject在这个ManagedBean上使用Spring WebFlow编辑。

嗯,据我所知,Spring中没有@Converter刻板印象。

我知道我可以使用

FacesContextUtils.getWebApplicationContext(context).getBean("WtvrBean")

但是,通过这种方法,Web应用程序和弹簧之间的耦合变得更加紧密。 (注释是元数据,甚至不被某些作者视为依赖)。

到目前为止,我正在使用FacesContextUtils,如果没有更好的解决方案。

有什么想法吗?

4 个答案:

答案 0 :(得分:13)

如果要将bean注入类的实例,则必须对这些实例进行弹簧管理。即spring必须实例化它们。这不会发生,所以 - 不,你不能注射那里。

但这是因为你在jsf中注册转换器。你可以跳过:

@Component("myConverter")
public class MyConverter implements Converter { .. }

然后,如果您使用的是弹簧<el-resolver>

converter="#{myConverter}"

这样就可以了。它对我有用。

(一个值得一提的解决方法是你可以使用aspectj weaving and @Configurable来实现,但我更喜欢你的FacesContextUtils方法。编织会修改类,以便即使它们不是由春天实例化。)

答案 1 :(得分:2)

@FacesConverter(value = "examTypeConverter")
@Named

简单回答。

答案 2 :(得分:0)

嘿,我遇到了同样的问题,即spring bean没有被注入JSF Converter。

然后通过谷歌搜索我发现答案,在JSF 2.2之后,我们可以将转换器作为jsf托管bean。然后我们可以注入spring依赖项。 它解决了我的问题。

 @ManagedBean
 @RequestScoped
 public class CustomerByName implements Converter {

      @ManagedProperty(value = "#{customerDao}")
      private CustomerDao customerDao;

并在您的jsf页面中将其用作托管bean

 converter="#{customerByName}"

答案 3 :(得分:-1)

将@Scope注释(例如带有“request”参数)添加到托管bean。

@ManagedBean
@Scope("request")
public class MyBean {
....
}