【问题标题】:Right way to use @Produce method使用@Produce方法的正确方法
【发布时间】:2013-08-05 14:20:32
【问题描述】:

我正在尝试将 CDI (weld-se 2) 和 JavaFX 结合起来,并且我想使用自定义创建的注释来注释我的控制器类,以便使用我的工厂方法管理此类创建。我想这应该如下所示,但这段代码不起作用。你能建议应该改变什么吗?

注解:

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE })
@Qualifier
public @interface FXMLManaged {
}

工厂类:

public class FXMLManagedProducer {
    @Produces @FXMLManaged
    public <T> T getFXMLManagedInstance(Class<T> type) {
        return type.newInstance();
    }
}

控制器类:

@FXMLManaged
public class NewsListView {
}

【问题讨论】:

  • 你看到堆栈跟踪了吗?
  • 这绝对不应该工作。
  • LightGuard,没有堆栈跟踪,只是在创建带注释的控制器时不调用工厂方法。
  • John Ament,您可能知道应该在代码中进行哪些更改以使其正常工作?
  • 你能展示一些注入NewListView的类的代码吗?这个类是在 CDI 上下文中创建的吗?

标签: java javafx-2 cdi jboss-weld


【解决方案1】:

您似乎将 CDI Extensions 与生产者混合在一起。首先,如果你想要一个生产者,工厂方法应该返回一个NewsListView,而不是泛型类型。使用 @Producer 和限定符注解将与注解类型绑定。所以不需要用@FXMLManaged注释NewsListView。然后你将NewsListView 注入到 bean 的某个地方。

生成视图:

public class FXMLManagedProducer {
    @Produces @FXMLManaged
    public NewsListView getFXMLManagedInstance() {
        return new NewsListView();
    }
}

使用生产者:

public class SomeBean {
    @Inject @FXMLManaged
    NewsListView view;
}

但我猜这不是你要找的。我想你可能想创建一个CDI Extension

public class YourExtension implements Extension {

    <T> void processAnnotatedType(@Observes ProcessAnnotatedType<T> pat) {
        if(pat.getAnnotatedType().isAnnotationPresent(FXMLManaged.class)) {
            // do your stuff here
        }
    } 
}

这样您就可以处理带注释的NewsListView。您可能想看看其他方法来挂钩生命周期,以便您可以创建 bean 并在必要时注入依赖项。

【讨论】:

    【解决方案2】:

    首先,您需要创建一个 Weld-Container 才能使用 CDI。以下是一些示例:

    http://java.dzone.com/articles/fxml-javafx-powered-cdi-jboss http://blog.matthieu.brouillard.fr/2012/08/fxml-javafx-powered-by-cdi-jboss-weld_6.html

    JavaFX 的 CDI API 正在开发中。它将成为 DataFX 的一部分。你可以在这里找到一些新闻:

    http://www.guigarage.com/2013/05/designing-javafx-business-applications-part-2/

    【讨论】:

      猜你喜欢
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 2013-01-09
      • 2010-12-28
      • 2012-04-26
      • 2014-10-24
      相关资源
      最近更新 更多