当我从Java EE 7 SDK示例'async-chat'对剩余资源'queue'进行OPTIONS调用时,当jersey的日志级别设置为FINE时,我会遇到很多例外(org.glassfish.jersey.level =精细).我的代码中发生了相同的异常,如下所示.两个应用程序都运行正
这些异常是否无关紧要(仅在日志记录级别为FINE时抛出)?
如果没有,他们为什么会被抛出?
我测试了几个GlassFish 4安装以及GlassFish 4.0.1.他们都表现出相同的行为.
例外:
Many of those entries:
FINE: Couldn't find JAX-B element for class java.lang.String
FINE: Couldn't find JAX-B element for class javax.ws.rs.core.Response
Also many of those (there are between 10 and 20 such error blocks):
FINE: java.lang.NoSuchMethodException: javax.ws.rs.container.ContainerRequestContext.<init>()
at java.lang.Class.getConstructor0(Class.java:2800)
at java.lang.Class.getDeclaredConstructor(Class.java:2043)
at org.glassfish.jersey.server.wadl.internal.generators.WadlGeneratorJAXBGrammarGenerator$6.resolve(WadlGeneratorJAXBGrammarGenerator.java:418)
at org.glassfish.jersey.server.wadl.WadlGenerator$ExternalGrammarDefinition.resolve(WadlGenerator.java:179)
at org.glassfish.jersey.server.wadl.internal.ApplicationDescription.resolve(ApplicationDescription.java:82)
at org.glassfish.jersey.server.wadl.internal.generators.WadlGeneratorJAXBGrammarGenerator.attachTypes(WadlGeneratorJAXBGrammarGenerator.java:481)
at org.glassfish.jersey.server.wadl.internal.WadlBuilder.generate(WadlBuilder.java:122)
at org.glassfish.jersey.server.wadl.internal.WadlApplicationContextImpl.getApplication(WadlApplicationContextImpl.java:131)
at org.glassfish.jersey.server.wadl.internal.WadlApplicationContextImpl.getApplication(WadlApplicationContextImpl.java:150)
at org.glassfish.jersey.server.wadl.processor.WadlModelProcessor$OptionsHandler.apply(WadlModelProcessor.java:134)
at org.glassfish.jersey.server.wadl.processor.WadlModelProcessor$OptionsHandler.apply(WadlModelProcessor.java:118)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) …
Run Code Online (Sandbox Code Playgroud) 那里,
我对Java EE和CDI非常新鲜.我尝试设置一个测试项目,以便使用JAX-RS和CDI完成我的第一步.我通过提供beans.xml来启用CDI.只要我测试,我就使用bean-discovery-mode ="all"元素.CDI似乎工作正常,因为我可以成功地将BeanManager注入我的测试资源,并且我可以输出它发现的所有bean.
我尝试注入一个由producer方法提供的类.Netbeans向我显示了对provideMe字段的警告: 没有找到符合注入bean条件的资源
当我将应用程序部署到Glassfish时,我得到了焊接异常:
WELD-001408 Unsatisfied dependencies for type [ProvideMeInterface] with qualifiers [@Default] at injection point [[BackedAnnotatedField] @Inject private com.test.rest.DataImport.provideMe]
Run Code Online (Sandbox Code Playgroud)
这是我的这个小测试的类:
接口:
package com.test.orm;
public interface ProvideMeInterface
{
int getCount();
}
Run Code Online (Sandbox Code Playgroud)
执行:
package com.test.orm;
public class ProvideMeImpl implements ProvideMeInterface {
int cnt;
ProvideMeImpl(int cnt)
{
this.cnt = cnt;
}
@Override
public int getCount() {
return cnt;
}
}
Run Code Online (Sandbox Code Playgroud)
制片人:
package com.test.orm;
import javax.enterprise.context.ApplicationScoped;
import javax.ws.rs.Produces;
public class ProvideMeProvider {
@Produces
@ApplicationScoped
public ProvideMeInterface produceFactory() {
return new …
Run Code Online (Sandbox Code Playgroud) 我有一个简单的测试应用程序,我将其部署到 GlassFish(只有一个资源注入了一个简单的类)。在 GlassFish 上,一切工作正常(除了记录 FINE 时的例外情况,请参阅此处)。我可以成功调用资源,并且 Weld CDI 正在执行注入。
现在,当我在 Java SE 中启动应用程序以使用 JUnit 进行单元测试时,HK2 似乎正在尝试提供注入,这会导致 UnsatisfiedDependencyException。
我可以定义一个 AbtractBinder 来绑定 InjectMe 类,以便 HK2 知道它。然后注射就可以正常工作了。但 Weld CDI 应该将该类注入 Jersey 资源,而不是 HK2。
引导是通过创建自定义 JUnit 运行程序 (WeldJUnit4Runner) 和@RunWith(WeldJUnit4Runner.class)
注释来完成的,有关示例,请参见此处:http ://blog.rocketscience.io/dependency-injection-with-cdi-in-java-se/
Weld CDI 已成功引导到 Java SE 环境,我可以成功地将 InjectMe 类注入到实际的 JUnit 测试类中,而不是注入到 Jersey 资源中。InjectMe 类是通过 Weld 引导发现的:
2014-07-16 10:41:12,730 [DEBUG] org.jboss.weld.Bootstrap - WELD-000106: Bean: Managed Bean [class com.test.rest.InjectMe] with qualifiers [@Any @Default]
Run Code Online (Sandbox Code Playgroud)
问题:在 Java SE 中运行时,为什么 HK2 尝试注入 InjectMe 类而不是 Weld? …