0

JSF 2.1 アプリケーションを Jboss EAP 6.1 (JBoss AS 7.2) に移植している最中です。このアプリケーションは、Glassfish 3.1 および Weblogic 12c でスムーズに動作します。さらに、わずかに類似したアプリケーションが正常に移植されました。この問題は、特定の EJB シングルトンで発生します。@PostConstructこれには、起動時に実行され、List を SelectItems で埋めるアノテーション付きのメソッドがあります。デプロイ中に、 JBoss がクラスjava.lang.ClassNotFoundExceptionを見つけられないという例外がスローされます。javax.faces.model.SelectItemメソッドをコメントアウトすると、すべて問題ありません。SelectItem クラスは、Web モジュール内の他のいくつかの Bean で問題なく使用されます。

私の質問は次のとおりです。この動作の既知の理由はありますか? javax.facesJBoss で実行されている EJB モジュールでパッケージのクラスを使用するには、特別な構成が必要ですか? JSF は EAR にパッケージ化されていないため、アプリケーションはサーバーの実装を使用します。

ありがとうございました!

4

1 に答える 1

1

設計ミスがあります。ビジネス サービス (EJB) 層には、Web (JSF) 層に関連する依存関係は想定されていません。EJB クラスにインポートを持つことjavax.faces.*は、そもそも間違っています。これにより、JAX-RS、Wicket、Struts、プレーンなサーブレットなどのさまざまな Web 層でビジネス サービスを再利用できなくなります。適切に設計されたアプリケーション サーバーでは、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 に答える