2016-06-09 65 views
1

由于某些原因,CDI似乎无法向WebSocket ServerEndpoint注入字符串。我收到错误Unsatisfied dependencies for type String with qualifiers @HelloMessage。我在下面包含了Producer和ServerEndpoint实现。有任何想法吗?注入似乎工作,如果我创建一个自定义类(比如说信使)并产生,而不是字符串。为什么CDI不能找到我的制作人?

预选赛实现

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; 
} 

回答

1

定义生产者时,我需要导入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!"; 
    } 
}