【问题标题】:Ambiguous resolution for field @Default in ErraiErrai 中 @Default 字段的模糊分辨率
【发布时间】:2019-10-09 00:34:13
【问题描述】:

我有一个包含两个选项的菜单,根据我选择的选项,我的应用程序应该显示 RepoNavBar 或 UserNavBar。这些类是 NavBar 的子类。

我有一个CommonPage,里面有所有项目中的一些通用组件,这个类有两个子RepoCommonPage和UserCommonPage,分别声明了RepoNavBar和UserNavBar。

CommonPage 使用 ContentComponent 类型的类,如下所示:

public void setup(CommonPage<?> parentPage) { 
    ...
}

当我尝试编译时,我得到了这个错误:

Caused by: java.lang.RuntimeException: 发现以下依赖问题: [INFO] @Any @Default com.client.local.usermgt.common.UserCommonPage 类中的字段 @Default com.client.local.common.ContentComponent 的不明确解析。

有什么问题?

这就是我的做法:

public abstract class NavBarComponent implements IsElement {

    @Templated(value = "navbar.html#navBtn")
    public static class NavBarItemComponent extends SimpleValueItemComponent<String> {...}
    ...
}
public class RepoNavBarComponent extends NavBarComponent {
     ...
}

public class UserNavBarComponent extends NavBarComponent {
     ...
}

public abstract class CommonPage<T extends ContentComponent> {
     ...
}

public class UserCommonPage<T extends ContentComponent> extends CommonPage<T>{
     ...
}

public class RepoCommonPage<T extends ContentComponent> extends CommonPage<T> { 
     ...
}

ContentComponent 是这样注入的:

public class UserCommonPage<T extends ContentComponent> extends CommonPage<T>{

    protected UserNavBarComponent userNavBar;

    public UserNavBarComponent getUserNavBar() {
        return userNavBar;
    }

    @PageShown
    public void preparePageShown() {
        log.debug("Page shown");
        userNavBar.refresh();
    }
}

【问题讨论】:

  • ContentComponent 注入UserCommonPage 怎么样?
  • 就像:public class UserCommonPage&lt;T extends ContentComponent&gt; extends CommonPage&lt;T&gt;{ protected UserNavBarComponent userNavBar; public UserNavBarComponent getUserNavBar() { return userNavBar; } @PageShown public void preparePageShown() { log.debug("Page shown"); userNavBar.refresh(); } }
  • 但我指的是UserCommonPageContentComponent@Inject定义

标签: java cdi errai


【解决方案1】:

我敢打赌,UserCommonPage(以及像 RepoCommonPage 这样的其他人)应该是 abstract

另外,如果这还不够,也许您需要为每个用例创建第三个扩展 ContentComponent 的中间类。例如:

 public abstract class UserCommonPage<T extends UserContentComponent> extends CommonPage<T>{

    @Inject
    protected UserNavBarComponent userNavBar;

    public UserNavBarComponent getUserNavBar() {
        return userNavBar;
    }

    @PageShown
    public void preparePageShown() {
        log.debug("Page shown");
        userNavBar.refresh();
    }
}

public class UserContentComponent extends ContentComponent{
   ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 2014-05-29
    • 2021-06-23
    相关资源
    最近更新 更多