【问题标题】:how the weld container service for application in java se environment?java se环境下应用的weld容器服务如何?
【发布时间】:2017-02-02 07:05:53
【问题描述】:

我是一个焊缝新手,经过几天的摸索,我只知道焊缝的一些基本概念。


我打算在java se环境中使用weld container。并按照What is the easiest way to have CDI and JPA in Java SE?我的代码段如下:

public class SayHello {
    public SayHello(){}
       public void sayHello(){
       System.out.println("Hello");
   }
}

import javax.inject.Inject;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

public class UseInject {
    private SayHello obj;
    public UseInject(){}

    @Inject
    public UseInject(SayHello obj){
        this.obj = obj;
    }

    public void show(){
        obj.sayHello();
    }

    public static void main(String[] args){
         Weld weld = new Weld();
         WeldContainer container = weld.initialize();
         UseInject ui = container.instance().select(UseInject.class).get();
         ui.show();
         weld.shutdown();
    }
  } 

我的应用程序基于 ma​​ven。这是 pom.xml

中的 jar 依赖段
 <dependency>
    <groupId>org.jboss.weld.se</groupId>
    <artifactId>weld-se-core</artifactId>
    <version>3.0.0.Alpha17</version>

我的意图是将 SayHello 对象注入到 UseInject 对象中,所以这个应用程序的最终输出是“Hello”。 但是事情并不是那么顺利,jvm报如下错误

通过网上搜索,有一种说法,构建一个空的beans.xml 是可以的,我按照它无法生效。至于ma​​in方法模仿What is the easiest way to have CDI and JPA in Java SE?不知道是干什么的,What is the easiest way to have CDI and JPA in Java SE?用的是@Produces注释,我不知道我是否也应该使用它。我本来打算将它用于 SayHello 类,但我不知道应该导入哪个 jar 才能使用它,所以我放弃了。


现在我想: 1.知道weld service for se 应用程序是怎么做的,也就是说main 方法做了什么?


2.如何使用 Weld 成功运行我的应用程序?


3.当我们应该使用注解@Produces


我参考了一些相关问题,例如weld and java seHow to bootstrap weld-se in a JUnit testetc。但发现他们对我来说都是高级的。 感谢您的关注。

【问题讨论】:

    标签: java maven cdi weld weld-se


    【解决方案1】:
    1. 如何使用 Weld 成功运行我的应用程序?

    错误消息告诉您必须在目录META-INF 下创建一个名为beans.xml 的文件。所以要解决这个问题,只需执行以下操作:

    1. src/main/resources目录下名为META-INF的目录
    2. META-INF 下创建一个名为beans.xml 的空文件,以便您的项目启用CDI。
    1. 什么时候我们应该使用注解@Produces

    如果您想使用任何 Java 原始类型(例如 Integer、String、...)作为 CDI bean,或者外部库中不包含 META-INF/beans.xml 类路径中的文件。

    示例:

    public class SayHello {
    
        @Produces
        private double pi = 3.14159;
        // the rest of the code
    }
    

    您可以将PI 的值注入代码中的另一个位置,如下所示:

    public class UseInject {
    
        @Inject
        private double pi;  // 3.14159 will be injected here
    
        // the rest of the code
    
        public static void main(...) {
            // ....
            UseInject ui = container.instance().select(UseInject.class).get();
            ui.show();
            System.out.println(ui.pi);
            // ...
        }
    

    值 3.14159 应该显示在控制台上。

    【讨论】:

    • 谢谢您,您的解决方案生效了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 2011-04-02
    • 2016-09-13
    相关资源
    最近更新 更多