2014-12-16 16 views
5

Tôi đang cố gắng @Inject dịch vụ Guice vào @ServerEndpoint. Tôi đang sử dụng Tomcat 8.0.15 khi triển khai JSR-356. Tuy nhiên, tiêm phụ thuộc không hoạt động. Có bất kỳ cấu hình bổ sung nào cần được thực hiện để cho phép phun Guice không? Lưu ý rằng tôi đang sử dụng tất cả các chú thích javax tiêu chuẩn.Tomcat8 WebSockets (JSR-356) với Guice 3.0

+0

"tiêm phụ thuộc không hoạt động" ... bạn có thể mô tả chi tiết hơn không? –

+0

Tôi nhận được một ngoại lệ instantiation khi tôi cố gắng để làm một constructor injection bằng cách sử dụng @Inject bên trong SeverEndpoint. – Aritra

Trả lời

6

Tôi đã tìm ra điều này. Điểm cuối Websocket cần phải có một trình cấu hình tùy chỉnh, tạo ra và trả về các cá thể bằng cách sử dụng cá thể bộ phun Guice.

Ví dụ:

Tuỳ chỉnh Guice bối cảnh servlet nghe:

public class CustomServletContextListener extends GuiceServletContextListener { 
    public static Injector injector; 

    @Override 
    protected Injector getInjector() { 
     injector = Guice.createInjector(...); 
     return injector; 
    } 
} 

Websockets tùy chỉnh cấu hình:

public class CustomConfigurator extends Configurator { 
    @Override 
    public <T> T getEndpointInstance(Class<T> clazz) 
     throws InstantiationException { 
    return CustomServletContextListener.injector.getInstance(clazz); 
    } 
} 

Và sau đó trong thiết bị đầu cuối WebSocket:

@ServerEndpoint(value = "/ws/sample_endpoint", configurator = CustomConfigurator.class) 
public class SampleEndpoint { 
    private final SomeService service; 

    @Inject 
    public SampleEndpoint(SomeService service) { 
    this.service = service; 
    } 
    ... 
} 
3

Building theo câu trả lời của Aritra:

Thành thật mà nói, tôi không biết chắc chắn nếu điều này làm việc với Guice 3.0, nhưng nó hoạt động với 4.0, đó là bản phát hành ổn định hiện tại.

Tôi nghĩ rằng một cách tiếp cận hơi sạch hơn là thay đổi CustomConfigurator của bạn vào một cái gì đó như thế này:

public class CustomConfigurator extends Configurator { 
    @Inject 
    private static Injector injector; 

    public <T> T getEndpointInstance(Class<T> endpointClass) { 
     return injector.getInstance(endpointClass); 
    } 
} 

Và sau đó từ mở rộng ServletModule lớp học của bạn configureServlets phương pháp, gọi requestStaticInjection(CustomConfigurator.class)

Bằng cách đó bạn sẽ không phơi nhiễm vòi phun cho mọi người. Tôi không biết về bạn, nhưng nó mang lại cho tôi một cảm giác tốt đẹp và mờ bên trong để biết rằng không ai có thể gây rối với vòi phun của tôi :-).