我正在将JSF 2.1应用程序移植到Jboss EAP 6.1(JBoss AS 7.2)。该应用程序在Glassfish 3.1和Weblogic 12c上顺利运行。此外,一个稍微类似的应用程序已成功移植。
问题发生在特定的EJB单例中。在这里,我有一个带@PostConstruct
注释的方法,它在启动时运行并用SelectItems填充List。在部署期间,抛出java.lang.ClassNotFoundException
异常,表示JBoss无法找到javax.faces.model.SelectItem
类。
如果我注释掉这个方法,一切都很好。 SelectItem类在Web模块中的其他一些bean中使用没有任何问题。
我的问题是:这种行为是否有任何已知原因?我是否需要一些特殊配置来使用在JBoss上运行的EJB模块中的javax.faces
包中的类?
JSF未与EAR打包在一起,因此应用程序使用服务器的实现。
谢谢!
答案 0 :(得分:1)
你有一个设计错误。业务服务(EJB)层不应该具有任何与Web(JSF)层相关的依赖关系。在EJB类中进行javax.faces.*
导入首先已经错了。它使业务服务在不同的Web层(例如JAX-RS,Wicket,Struts,普通servlet等)之间不可用。在设计良好的应用程序服务器中,从EJB层到达Web层类的无法实现(Java EE默认值) )类加载器的限制。
保持EJB不受JSF依赖性的影响。请改为在eagerly initialized application scoped JSF managed bean中执行所需的工作。
@ManagedBean(eager=true)
@ApplicationScoped
public class App {
private List<SelectItem> someItems;
@EJB
private AppService service;
@PostConstruct
public void init() {
// Populate your List<SelectItem> here.
}
}