0

我正在将 JSF 2.1 应用程序移植到 Jboss EAP 6.1 (JBoss AS 7.2)。该应用程序在 Glassfish 3.1 和 Weblogic 12c 上运行顺畅。此外,成功移植了一个稍微相似的应用程序。该问题发生在特定的 EJB 单例中。在此,我有一个带有@PostConstruct注释的方法,它在启动时运行并用 SelectItems 填充列表。在部署期间,java.lang.ClassNotFoundException抛出一个异常,表示 JBoss 找不到javax.faces.model.SelectItem该类。如果我注释掉该方法,一切都很好。SelectItem 类在 web 模块中的其他一些 bean 中使用没有任何问题。

我的问题是:这种行为有什么已知的原因吗?我是否需要一些特殊配置才能使用javax.facesEJB 模块中的包中的类,在 JBoss 上运行?JSF 没有与 EAR 一起打包,因此应用程序使用服务器的实现。

谢谢!

4

1 回答 1

1

你有一个设计错误。业务服务 (EJB) 层不应具有任何与 Web (JSF) 层相关的依赖项。在javax.faces.*EJB 类中导入首先是错误的。它使业务服务无法跨不同的 Web 层(例如 JAX-RS、Wicket、Struts、普通 servlet 等)重用。在设计良好的应用程序服务器中,无法从 EJB 层访问 Web 层类已经由(Java EE 默认) 类加载器中的限制。

保持 EJB 没有 JSF 依赖项。而是在一个急切初始化的 应用程序范围的 JSF 托管 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.
    }

}
于 2013-12-02T16:07:29.440 回答