我正在尝试@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
,如果没有更好的解决方案。
有什么想法吗?
答案 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)
然后通过谷歌搜索我发现答案,在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 {
....
}