为什么 CDI 找不到我的制作人?
Why Can't CDI Find My Producer?
出于某种原因,CDI 似乎无法将字符串注入 WebSocket ServerEndpoint。我收到错误 Unsatisfied dependencies for type String with qualifiers @HelloMessage
。我在下面包含了 Producer 和 ServerEndpoint 实现。有任何想法吗?如果我创建自定义 class(比如 Messenger)并生成它而不是 String,注入似乎有效。
限定符实现
import javax.inject.Qualifier;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public
@interface HelloMessage
{
}
生产者实施
import java.io.Serializable;
import javax.inject.Named;
import javax.ws.rs.Produces;
public
class StringProducer
implements Serializable
{
@Produces
@HelloMessage
public
String getMessage()
{
return "Hello, from Message!";
}
}
ServerEndpoint 实现
import javax.inject.Inject;
import javax.inject.Named;
import javax.websocket.OnMessage;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint(value = "/test")
public
class TestEndpoint
{
@OnMessage
public
void onMessage(Session session, String unused)
{
System.out.println(this.message);
}
@Inject @HelloMessage
private String message;
}
我需要在定义 Producer 时导入 javax.enterprise.inject.Produces
而不是 javax.ws.rs.Produces
。
生产者实施
import java.io.Serializable;
import javax.inject.Named;
import javax.enterprise.inject.Produces;
public
class StringProducer
implements Serializable
{
@Produces
@HelloMessage
public
String getMessage()
{
return "Hello, from Message!";
}
}
出于某种原因,CDI 似乎无法将字符串注入 WebSocket ServerEndpoint。我收到错误 Unsatisfied dependencies for type String with qualifiers @HelloMessage
。我在下面包含了 Producer 和 ServerEndpoint 实现。有任何想法吗?如果我创建自定义 class(比如 Messenger)并生成它而不是 String,注入似乎有效。
限定符实现
import javax.inject.Qualifier;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public
@interface HelloMessage
{
}
生产者实施
import java.io.Serializable;
import javax.inject.Named;
import javax.ws.rs.Produces;
public
class StringProducer
implements Serializable
{
@Produces
@HelloMessage
public
String getMessage()
{
return "Hello, from Message!";
}
}
ServerEndpoint 实现
import javax.inject.Inject;
import javax.inject.Named;
import javax.websocket.OnMessage;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint(value = "/test")
public
class TestEndpoint
{
@OnMessage
public
void onMessage(Session session, String unused)
{
System.out.println(this.message);
}
@Inject @HelloMessage
private String message;
}
我需要在定义 Producer 时导入 javax.enterprise.inject.Produces
而不是 javax.ws.rs.Produces
。
生产者实施
import java.io.Serializable;
import javax.inject.Named;
import javax.enterprise.inject.Produces;
public
class StringProducer
implements Serializable
{
@Produces
@HelloMessage
public
String getMessage()
{
return "Hello, from Message!";
}
}