JBoss EAP 6.1上EJB模块中的JSF ClassNotFoundException

时间:2013-12-02 16:01:57

标签: jsf ejb jboss7.x classnotfoundexception jboss-eap-6

我正在将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打包在一起,因此应用程序使用服务器的实现。

谢谢!

1 个答案:

答案 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.
    }

}