带有@Context的Jersey构造函数注入不起作用
Jersey constructor injection with @Context not working
跟进 ,我的问题是我是否在这里做错了根本性的事情:
使用 GlassFish 4.1,我正在尝试编写一个 MessageBodyReader
,它具有如下构造函数:
package com.acme;
import javax.ws.rs.core.Context;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.Providers;
import javax.ws.rs.Consumes;
@Provider
@Consumes( "application/xml" )
public class MyMessageBodyReader implements MessageBodyReader<Object> {
public MyMessageBodyReader(@Context Providers ps) {
// try to do something with ps here
// e.g. pass to a superclass constructor,
// as required by the solution in the other thread
}
[...] // implemented interface methods
}
但是无论我做什么周围的配置,我总是得到这些异常的序列:
2016-06-07T17:19:28.484+0200|WARN: The following warnings have been detected: WARNING: Unknown HK2 failure detected:
MultiException stack 1 of 1
org.jboss.weld.exceptions.CreationException: WELD-001530: Cannot produce an instance of class com.acme.MyMessageBodyReader.
at org.jboss.weld.injection.producer.NonProducibleInjectionTarget.produce(NonProducibleInjectionTarget.java:55)
at org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider$CdiFactory.getInstance(CdiComponentProvider.java:242)
at org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider$CdiFactory.provide(CdiComponentProvider.java:189)
[...]
其次是
WARNING: Unknown HK2 failure detected:
MultiException stack 1 of 2
org.jboss.weld.exceptions.CreationException: WELD-001530: Cannot produce an instance of class com.acme.MyMessageBodyReader.
at org.jboss.weld.injection.producer.NonProducibleInjectionTarget.produce(NonProducibleInjectionTarget.java:55)
at org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider$CdiFactory.getInstance(CdiComponentProvider.java:242)
at org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider$CdiFactory.provide(CdiComponentProvider.java:189)
[...]
MultiException stack 2 of 2
java.lang.IllegalStateException: Unable to perform operation: create on org.glassfish.jersey.message.internal.MessageBodyFactory
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:389)
at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:461)
at org.jvnet.hk2.internal.SingletonContext.compute(SingletonContext.java:114)
[...]
我发现了几个将 Providers
注入构造函数的示例,尤其是在 GlassFish 4.1 附带的 XmlRootElementJaxbProvider
的子 class 中——毕竟,我无论如何都想重用他们的 class 层次结构,就像在链接线程中所做的那样。
提前感谢您的任何建议。
我无法解释异常的根本原因,但我 运行 遇到了同样的问题,当时我不想再深入研究 Jersey 源代码了。
我最终懒洋洋地加载了我的自定义 MessageBodyReader/Writers,这样我就可以将 Providers
注入到包装器中。它不漂亮,但它有效。
大致如下:
@Provider
@Consumes( "application/xml" )
public class MyLazyMessageBodyReader implements MessageBodyReader<Object> {
@Context
private Providers ps;
private MessageBodyReader<Object> reader;
@Override
public final Object readFrom(
Class<Object> type,
Type type1,
Annotation[] antns,
MediaType mt,
MultivaluedMap<String, String> mm,
InputStream in)
throws IOException, WebApplicationException
{
return this.getLazyReader().readFrom(type, type1, antns, mt, mm, in);
}
private MessageBodyReader<Object> getLazyReader() {
if (this.reader == null) {
this.reader = new MyMessageBodyReader(this.ps);
}
return this.reader;
}
}
public class MyMessageBodyReader implements MessageBodyReader<Object> {
public MyMessageBodyReader(Providers ps) {
// try to do something with ps here
// e.g. pass to a superclass constructor,
// as required by the solution in the other thread
}
[...] // implemented interface methods
}
跟进
使用 GlassFish 4.1,我正在尝试编写一个 MessageBodyReader
,它具有如下构造函数:
package com.acme;
import javax.ws.rs.core.Context;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.Providers;
import javax.ws.rs.Consumes;
@Provider
@Consumes( "application/xml" )
public class MyMessageBodyReader implements MessageBodyReader<Object> {
public MyMessageBodyReader(@Context Providers ps) {
// try to do something with ps here
// e.g. pass to a superclass constructor,
// as required by the solution in the other thread
}
[...] // implemented interface methods
}
但是无论我做什么周围的配置,我总是得到这些异常的序列:
2016-06-07T17:19:28.484+0200|WARN: The following warnings have been detected: WARNING: Unknown HK2 failure detected:
MultiException stack 1 of 1
org.jboss.weld.exceptions.CreationException: WELD-001530: Cannot produce an instance of class com.acme.MyMessageBodyReader.
at org.jboss.weld.injection.producer.NonProducibleInjectionTarget.produce(NonProducibleInjectionTarget.java:55)
at org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider$CdiFactory.getInstance(CdiComponentProvider.java:242)
at org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider$CdiFactory.provide(CdiComponentProvider.java:189)
[...]
其次是
WARNING: Unknown HK2 failure detected:
MultiException stack 1 of 2
org.jboss.weld.exceptions.CreationException: WELD-001530: Cannot produce an instance of class com.acme.MyMessageBodyReader.
at org.jboss.weld.injection.producer.NonProducibleInjectionTarget.produce(NonProducibleInjectionTarget.java:55)
at org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider$CdiFactory.getInstance(CdiComponentProvider.java:242)
at org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider$CdiFactory.provide(CdiComponentProvider.java:189)
[...]
MultiException stack 2 of 2
java.lang.IllegalStateException: Unable to perform operation: create on org.glassfish.jersey.message.internal.MessageBodyFactory
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:389)
at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:461)
at org.jvnet.hk2.internal.SingletonContext.compute(SingletonContext.java:114)
[...]
我发现了几个将 Providers
注入构造函数的示例,尤其是在 GlassFish 4.1 附带的 XmlRootElementJaxbProvider
的子 class 中——毕竟,我无论如何都想重用他们的 class 层次结构,就像在链接线程中所做的那样。
提前感谢您的任何建议。
我无法解释异常的根本原因,但我 运行 遇到了同样的问题,当时我不想再深入研究 Jersey 源代码了。
我最终懒洋洋地加载了我的自定义 MessageBodyReader/Writers,这样我就可以将 Providers
注入到包装器中。它不漂亮,但它有效。
大致如下:
@Provider
@Consumes( "application/xml" )
public class MyLazyMessageBodyReader implements MessageBodyReader<Object> {
@Context
private Providers ps;
private MessageBodyReader<Object> reader;
@Override
public final Object readFrom(
Class<Object> type,
Type type1,
Annotation[] antns,
MediaType mt,
MultivaluedMap<String, String> mm,
InputStream in)
throws IOException, WebApplicationException
{
return this.getLazyReader().readFrom(type, type1, antns, mt, mm, in);
}
private MessageBodyReader<Object> getLazyReader() {
if (this.reader == null) {
this.reader = new MyMessageBodyReader(this.ps);
}
return this.reader;
}
}
public class MyMessageBodyReader implements MessageBodyReader<Object> {
public MyMessageBodyReader(Providers ps) {
// try to do something with ps here
// e.g. pass to a superclass constructor,
// as required by the solution in the other thread
}
[...] // implemented interface methods
}