在我的Java EE项目中,我有一些抽象类.IntelliJ IDEA强调它们是红色并告诉我:
托管bean必须是具体类,或者使用@Decorator注释
如果顶级Java类被任何其他Java EE规范定义为托管bean,或者满足以下所有条件,则它是托管bean:
- 它不是一个非静态的内部类.
- 它是一个具体的类,或者注释为@Decorator.
- 它没有使用EJB组件定义注释或在ejb-jar.xml中声明为EJB bean类.
- 它有一个合适的构造函数 - 或者:
- 该类有一个没有参数的构造函数,或者
- 该类声明一个注释为@Inject的构造函数.
我只想使用抽象类,没有任何注释.虽然IntelliJ告诉我这是一个错误,但我的JBoss服务器并没有抱怨它.
任何解释?
我正在玩Weld-SE(Java SE)并注意到如果类路径中有很多JAR,那么JVM启动时间会持续几秒钟.
有没有办法将扫描路径指定/限制为像Apache Ant或AspectJ中的包模式或路径模式?
PS:在Weld论坛注册只是不起作用 - 它一直说"你的密码是微不足道的"
好的,所以我有一个JSF支持bean需要引用另一个(@NoneScoped)bean.
我应该@Inject它还是使用@ManagedProperty从容器中获取实例引用?
为什么要使用一个而不是另一个,在我看来,这两种方法实现了同样的目的.
我们假设我有一个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一样创建我的汽车.你怎么建议我创造那些汽车?
我一直试图让这个设置运行几天,但仍然没有运气.这是我一直在使用的测试应用程序:
@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.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)
到目前为止我学到了什么:
到目前为止我尝试过的事情:
在保留CDI支持的同时在WL12c上使用MyFaces真的很难吗?或者我只是错过了明显的问题?谢谢你的帮助.
如何允许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) 我使用的代码如下:
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 …
我使用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.
现在,任何人都知道我该怎么做?
我需要在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) 尝试将参数注入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方法,这些都可以正常工作,但是在这种情况下,我更喜欢使用构造函数注入。
有什么想法怎么了?
cdi ×10
java ×4
jsf ×3
java-ee ×2
weld ×2
grizzly ×1
java-ee-6 ×1
jax-rs ×1
jboss-weld ×1
jersey ×1
jsf-2 ×1
managed-bean ×1
myfaces ×1
spring ×1
weblogic12c ×1