标签: cdi

IDEA错误"托管bean必须是具体类,或者使用@Decorator注释"

在我的Java EE项目中,我有一些抽象类.IntelliJ IDEA强调它们是红色并告诉我:

托管bean必须是具体类,或者使用@Decorator注释

如果顶级Java类被任何其他Java EE规范定义为托管bean,或者满足以下所有条件,则它是托管bean:

  • 它不是一个非静态的内部类.
  • 它是一个具体的类,或者注释为@Decorator.
  • 它没有使用EJB组件定义注释或在ejb-jar.xml中声明为EJB bean类.
  • 它有一个合适的构造函数 - 或者:
    • 该类有一个没有参数的构造函数,或者
    • 该类声明一个注释为@Inject的构造函数.

我只想使用抽象类,没有任何注释.虽然IntelliJ告诉我这是一个错误,但我的JBoss服务器并没有抱怨它.

任何解释?

abstract-class intellij-idea java-ee cdi

13
推荐指数
1
解决办法
1778
查看次数

可以在Weld中控制类路径扫描吗?

我正在玩Weld-SE(Java SE)并注意到如果类路径中有很多JAR,那么JVM启动时间会持续几秒钟.

有没有办法将扫描路径指定/限制为像Apache Ant或AspectJ中的包模式或路径模式?

PS:在Weld论坛注册只是不起作用 - 它一直说"你的密码是微不足道的"

dependency-injection cdi jboss-weld

12
推荐指数
3
解决办法
4244
查看次数

注入vs ManagedProperty

好的,所以我有一个JSF支持bean需要引用另一个(@NoneScoped)bean.

我应该@Inject它还是使用@ManagedProperty从容器中获取实例引用?

为什么要使用一个而不是另一个,在我看来,这两种方法实现了同样的目的.

jsf cdi managed-bean

12
推荐指数
2
解决办法
8191
查看次数

如何在CDI中动态创建实例

我们假设我有一个Car类.在我的代码中,我想创建10辆汽车.Car类有一些@Inject注释依赖项.这样做的最佳方法是什么?

CDI有一个Provider接口,我可以使用它来创建汽车:

@Inject Provider<Car> carProvider;
public void businessMethod(){
    Car car = carProvider.get();
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果我没有CarFactory,它有一个带有@Produces注释的方法来创建汽车,那就不行了.尽管它反映了现实世界我无法在没有工厂的情况下制造汽车,但我宁愿不为所有东西编写工厂.我只是希望CDI容器像任何其他bean一样创建我的汽车.你怎么建议我创造那些汽车?

java cdi java-ee-6

12
推荐指数
2
解决办法
1万
查看次数

可以在WebLogic 12c上使用MyFaces + CDI吗?

我一直试图让这个设置运行几天,但仍然没有运气.这是我一直在使用的测试应用程序:

@Named
@RequestScoped
public class Test {

    private String test = "test";
    public String getTest() { return test; }
    public void setTest(String test) { this.test = test; }
}
Run Code Online (Sandbox Code Playgroud)

在jsf页面中:

<h:outputText value="#{test.test}"/>
Run Code Online (Sandbox Code Playgroud)

在没有MyFaces的情况下运行此示例工作正常(呈现"测试"应该如此),但是当我在WAR文件中部署MyFaces并在weblogic.xml中执行必要的配置时,CDI似乎停止工作(或者至少是JSF和CDI)并且输出html中没有显示任何内容.不过,MyFaces本身似乎没问题.

我的基本配置如下:

  • WebLogic Server 12c(12.1.1.0),补丁应该是最新的,因为我刚刚下载了一个开发版本,只是为了确保
  • MyFaces-2.1.10,部署在WEB-INF/libs中
  • Beans.xml已经到位
  • org.apache.myfaces.webapp.StartupServletContextListener已在web.xml中注册
  • WebLogic配置为使用weblogic.xml来使用MyFaces

Weblogic.xml内容:

<prefer-application-packages>
    <package-name>javax.faces.*</package-name>
    <package-name>com.sun.faces.*</package-name>
    <package-name>com.bea.faces.*</package-name>
</prefer-application-packages>
<prefer-application-resources>
    <resource-name>javax.faces.*</resource-name>
    <resource-name>com.sun.faces.*</resource-name>
    <resource-name>com.bea.faces.*</resource-name>
    <resource-name>META-INF/services/javax.servlet.ServletContainerInitializer</resource-name>
    <resource-name>META-INF/services/com.sun.faces.spi.FacesConfigResourceProvider</resource-name>
</prefer-application-resources>
Run Code Online (Sandbox Code Playgroud)

到目前为止我学到了什么:

  • WL12c配备了Weld 1.1.3,因为它的CDI实现.
  • 我读到某处(不记得在哪里)每当你决定切换JSF实现时,你自己负责集成JSF/CDI.这是真的吗(肯定不希望)?

到目前为止我尝试过的事情:

  • 将MyFaces CODI添加到混合物中,希望它能以某种方式将Weld和MyFaces粘合在一起,但事实并非如此.
  • 将OpenWebBeans替换为Weld作为CDI实现.这似乎最初起作用,但稍后在一些内部sun.reflection包中提供了各种有趣的ClassCastExceptions.无论如何,这是一个我宁愿避免的解决方案.
  • 使用web.xml和faces-config.xml中的各种选项手动触发Weld.这似乎让Weld继续使用各种错误消息来淹没日志.在某种程度上,这些可以通过将weblogic升级到更新的Weld版本来"修复",但每次我这样做时都会遇到下一个错误.再说一遍,我宁愿避开这条路线.

在保留CDI支持的同时在WL12c上使用MyFaces真的很难吗?或者我只是错过了明显的问题?谢谢你的帮助.

jsf myfaces cdi weblogic12c

12
推荐指数
1
解决办法
2761
查看次数

如何在运行grizzly的java se上启用web服务(jaxrs/jersey)中的CDI注入?

如何允许CDI将资源注入到宁静的Web服务资源中?我使用焊接2(cdi),泽西(jaxrs)和灰熊(网络服务器)在标准java上运行.这是我简单的网络资源:

import training.student.StudentRepository;
import javax.inject.Inject;
import javax.ws.rs.*;

@Path("student")
public class StudentWebResource {
  @Inject
  private StudentRepository studentRepository;  

  @GET
  @Path("count")
  @Produces(MediaType.TEXT_PLAIN)
  public Integer getCount() {
    return studentRepository.studentCount();
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我如何焊接启动我的简单Web服务器:

public class Main {
  public static void main(String[] args) throws Exception {
    startCdiApplication();
  }

  public static void startCdiApplication() throws Exception {
    Weld weld = new Weld();
    try {
      WeldContainer container = weld.initialize();
      Application application = container.instance().select(WebServer.class).get();
      application.run();
    } 
    finally {
      weld.shutdown();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我怀疑的代码需要修改,以通知球衣使用焊接CDI注入分辨率:

...
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.jackson.JacksonFeature; …
Run Code Online (Sandbox Code Playgroud)

java jax-rs jersey grizzly cdi

12
推荐指数
2
解决办法
2万
查看次数

CDI对@Produces的不明确依赖 - 为什么?

我使用的代码如下:

public Configuration {

    private boolean isBatmanCar = someMethod(...);

    @Produces
    public Car getCar(@New Car car) {
        if(isBatmanCar) {
            car.setName("BatmanCar");
        }
        return car;
    }
}

public Car {
    private String name = "NormalCar";

    public void setName(String name) {
        this.name = name;
    }
}

public Demo {
    @Inject
    Car car;

    // rest of code
}
Run Code Online (Sandbox Code Playgroud)

当我将应用程序部署到glassfish(Java EE 6顺便说一句)时,我得到了

AmbiguousResolutionException: WELD-001318 Cannot resolve an ambiguous dependency between (...) Car with qualifiers [@Any @Default] (...) Producer Method [Car] with qualifiers [@Any @Default]

我知道当我添加@Alternative …

java-ee cdi weld

12
推荐指数
3
解决办法
1万
查看次数

将参数传递给@Inject Bean的实例

我使用CDI作为注入框架,但我发现它的使用有一些限制,这是其中之一.我正在尝试使用运行时值初始化bean实例的创建.例:

@RequestScoped
public class MyNumber {
   int number;

   public MyNumber(int number) {
      this.number = number;
   }

   public String toString() {
      return "Your number is: " + number;
   }
}

public class UseNumber {
   @Inject
   Instance<MyNumber> number;

   public void doStuff() {
      int a = 8;
      MyNumber mN = number.select(a).get(); // ?? - Obviously this does not work.

      System.out.print(mN); // Should print: "Your number is: 8"
   }
}
Run Code Online (Sandbox Code Playgroud)

请注意,"a"在示例中是常量,但实际上它是一个变量; 我澄清这一点,所以你不要发布一个答案,@Producer然后在构造函数中注入值MyNumber.

现在,任何人都知道我该怎么做?

java cdi

12
推荐指数
2
解决办法
1万
查看次数

在Spring + Tomcat上使用JSF 2.2.9导致java.lang.NoClassDefFoundError:javax/enterprise/context/spi/Contextual

我需要在JSF组件中使用自定义html属性,为此我发现的唯一解决方案是使用JSF 2.2,这样:

<f:passThroughAttribute name="data-toggle" value="modal" />
Run Code Online (Sandbox Code Playgroud)

问题是我正在使用Spring + Tomcat而我无法改变这个因为我没有时间.每次我启动我的服务器时都会出现以下错误:

Informações: CDI @ViewScoped manager unavailable
java.lang.NoClassDefFoundError: javax/enterprise/context/spi/Contextual
Run Code Online (Sandbox Code Playgroud)

我知道这是因为我不使用CDI,但正如我所说,由于时间的原因,我无法从Spring改为CDI.

我怎么解决这个问题 ?我必须使用JSF 2.2(因为自定义html属性)和Spring.

解决了:

这个问题解决了,我降级到JSF 2.2.6并且错误停止了.

堆栈跟踪:

Fev 01, 2015 4:13:57 PM com.sun.faces.application.view.ViewScopeManager <init>
Informações: CDI @ViewScoped manager unavailable
java.lang.NoClassDefFoundError: javax/enterprise/context/spi/Contextual
at com.sun.faces.application.view.ViewScopeManager.<init>(Unknown Source)
at com.sun.faces.application.view.ViewScopeManager.getInstance(Unknown Source)
at com.sun.faces.application.view.ViewScopeEventListener.processEvent(Unknown Source)
at javax.faces.event.SystemEvent.processListener(Unknown Source)
at javax.faces.event.ComponentSystemEvent.processListener(Unknown Source)
at com.sun.faces.application.ApplicationImpl.processListeners(Unknown Source)
at com.sun.faces.application.ApplicationImpl.invokeListenersFor(Unknown Source)
at com.sun.faces.application.ApplicationImpl.publishEvent(Unknown Source)
at javax.faces.component.UIViewRoot.getViewMap(Unknown Source)
at javax.faces.component.UIViewRoot.getViewMap(Unknown Source)
at com.sun.faces.mgbean.BeanManager$ScopeManager$ViewScopeHandler.handle(Unknown Source)
at com.sun.faces.mgbean.BeanManager$ScopeManager.pushToScope(Unknown Source)
at com.sun.faces.mgbean.BeanManager.createAndPush(Unknown Source)
at com.sun.faces.mgbean.BeanManager.create(Unknown Source) …
Run Code Online (Sandbox Code Playgroud)

jsf spring cdi jsf-2

12
推荐指数
2
解决办法
2万
查看次数

CDI对象不可与注入的构造函数一起代理

尝试将参数注入CDI bean(ApplicationScoped)的构造函数时,遇到以下问题:

Caused by: org.jboss.weld.exceptions.UnproxyableResolutionException: WELD-001435: Normal scoped bean class xx.Config is not proxyable because it has no no-args constructor - Managed Bean [class xx.Config] with qualifiers [@Default @Named @Any].
    at org.jboss.weld.bean.proxy.DefaultProxyInstantiator.validateNoargConstructor(DefaultProxyInstantiator.java:50)
    at org.jboss.weld.util.Proxies.getUnproxyableClassException(Proxies.java:217)
    at org.jboss.weld.util.Proxies.getUnproxyableTypeException(Proxies.java:178)
Run Code Online (Sandbox Code Playgroud)

但是,我在类上确实有一个可注入的构造函数:

@Inject
public Config(ConfigLocator configLocator) {
    defaultConfigPath = configLocator.getPath();
    doStuff();
}
Run Code Online (Sandbox Code Playgroud)

使用默认构造函数,变量注入和postconstruct方法,这些都可以正常工作,但是在这种情况下,我更喜欢使用构造函数注入。

有什么想法怎么了?

java dependency-injection cdi weld

12
推荐指数
3
解决办法
3845
查看次数