2

親クラスと呼ばれるNavigation子クラスとと呼ばれる子クラスがありExtendingNavigationます。and (javax.enterprise.context.SessionScoped;)Navigationとして注釈が付けられます。その中で、メソッドに注入して初期化します。他のクラスで使用したいとしましょう。どうすればいいですか?そして、なぜ私はから拡張できないのですか?@Named("navigation")@SessionScopedUserBeanlogin()userBeanNavigation

ここにクラスがあります(例のためだけに):

ナビゲーション

@Named("navigation")
@SessionScoped
public class Navigation implements Serializable {
    private static final long serialVersionUID = 1L;

    @Inject
    protected UserBean userBean;

        public void logout() {
        userBean = null;
    }

    public void login() {       
        EntityManager em = JPAUtil.getEntityManagerFactory().createEntityManager();
        userBean = em.find(UserBean.class, userBean.getUsername());
    }
}

ExtendingNavigation

public class ExtendingNavigation extends Navigation{


}

これをコンパイルしようとすると、エラーが発生します。

17:01:29,956 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-7) MSC00001: Failed to start service jboss.deployment.unit."timereport.war".WeldService: org.jboss.msc.service.StartException in service jboss.deployment.unit."timereport.war".WeldService: org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies for type [NavigationBean] with qualifiers [@Default] at injection point [[field] @Inject timereport.ui.biz.faces.context.ValidateUserAuthenticationAction.navigation]. Possible dependencies [[Managed Bean [class timereport.navigation.NavigationBean] with qualifiers [@Any @Default @Named], Managed Bean [class timereport.navigation.ExtendingNavigation] with qualifiers [@Any @Default]]]
    at org.jboss.as.weld.services.WeldService.start(WeldService.java:96)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1824) [jboss-msc-1.0.1.GA.jar:1.0.1.GA]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1759) [jboss-msc-1.0.1.GA.jar:1.0.1.GA]
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) [:1.6.0_07]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) [:1.6.0_07]
    at java.lang.Thread.run(Thread.java:619) [:1.6.0_07]
Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies for type [NavigationBean] with qualifiers [@Default] at injection point [[field] @Inject timereport.ui.biz.faces.context.ValidateUserAuthenticationAction.navigation]. Possible dependencies [[Managed Bean [class timereport.navigation.NavigationBean] with qualifiers [@Any @Default @Named], Managed Bean [class timereport.navigation.ExtendingNavigation] with qualifiers [@Any @Default]]]
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:274)
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:106)
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:129)
    at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:351)
    at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:336)
    at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:404)
    at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:82)
    at org.jboss.as.weld.services.WeldService.start(WeldService.java:89)
    ... 5 more

plsを助けて!

4

3 に答える 3

1

問題は、クラスにインスタンスを注入していることですがNavigationValidateUserAuthenticationAction主な例外状態と同様に、その注入ポイントで使用できる2つの異なるクラスがあります。これを解決する最も簡単な方法は、注入ポイント(選択した場合)と2つのNavigationクラスのいずれかに修飾子を追加することです。

修飾子は、この問題の解決策であり、仕様に含まれているという全体的なポイントです。修飾子は、インジェクションポイントの曖昧性解消を追加します。つまり、クラスとインジェクションポイントを特殊化するのに役立ちます。

于 2011-11-24T20:15:12.440 に答える
1

問題はの注入ではありませんUserBean、あなたは絶対に他の場所でそれを使うことができます。

問題は、サブクラスExtendingNavigationがクラスと同じ修飾子Navigation(「ナビゲーション」という名前)を持っていることです。注釈などExtendingNavigationを付けて、使用する場所と一緒に@Named("extendedNavigation")指定します。@Named("extendedNavigation")@Inject

このように考えてください。実際にはナビゲーションである2つのクラスがあるため、「クラスXのインスタンスを教えてください」と言っており、Weldは「どちらが必要かわかりません」と言っています。

class ValidateUserAuthenticationAction {
    @Inject
    @Named("extendedNavigation")
    private Navigation navigation;
}

また、インターフェースを使用してみてください!ナビゲーションはインターフェースである必要があります。BasicNavigationはそれを実装する必要があり、ExtendedNavigationもそれを実装する必要があります。

于 2011-11-24T20:59:30.497 に答える
0

私は非常によく似た問題を抱えていました、そして私はいくつかのオフラインの助けを得ました。私の問題は、私のサービスがあった場所で、それがデプロイされた耳と私のWebプロジェクトにも含まれていたことでした。それは偶然の重複でした、1つをドロップしてください、そしてそれがあなたの場合でもうまくいくでしょう。

次の写真では、esb_khr_web内にesb_khrがあり、削除しました。Eclipseの場合:プロパティとデプロイメントアセンブリに移動します。

ここに画像の説明を入力してください

于 2013-03-19T10:17:55.207 に答える