2

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


我打算在java se环境中使用焊接容器。并遵循在 Java SE 中拥有 CDI 和 JPA 的最简单方法是什么?我的代码段如下:

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();
    }
  } 

我的应用程序基于maven。这是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是可以的,我按照它不能生效。至于我模仿的主要方法在Java SE中拥有CDI和JPA的最简单方法是什么? 我不知道它做了 什么,在 Java SE 中拥有 CDI 和 JPA 的最简单方法是什么?使用@Produces注解,我不知道我是否也应该使用它。我本来打算将它用于 SayHello 类,但我不知道应该导入哪个 jar 才能使用它,所以我放弃了。


现在我想: 1.知道se应用程序的焊接服务如何,换句话说,主要方法是做什么的?


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


3. 什么时候应该使用注解@Produces


我参考了一些相关问题,例如weld 和java se如何在JUnit 测试中引导weld-se等,但发现它们对我来说都是高级的。 感谢您提前关注。

4

1 回答 1

3
  1. 如何使用焊接成功运行我的应用程序?

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

  1. 目录下命名META-INFsrc/main/resources目录
  2. beans.xml创建一个名为under的空文件,META-INF以便您的项目启用 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 应显示在控制台上。

于 2016-09-24T16:35:05.933 回答