2011-10-07 28 views
5

Chúng tôi có một tình huống mà chúng tôi sử dụng các mũi tiêm dựa trên JSR-330 để định cấu hình các ứng dụng Java 6 độc lập của chúng tôi, hoạt động rất tốt để nhận các tham số cấu hình trên tất cả các lớp .Sử dụng Guice 3 với JAX-WS trong Java 6 thùng chứa bên ngoài web

Chúng tôi cũng đã sử dụng dịch vụ web JAX-WS trong một thời gian bằng cách sử dụng phân phối Metro độc lập đầu tiên với Java 5 bên trong một thùng chứa web, nhưng với Java 6, chúng tôi chỉ sử dụng lớp Endpoint để có dấu chân nhỏ hơn.

Vì vậy, bây giờ tôi có một tình huống mà tôi có

  • Một độc lập Java 6 ứng dụng - không chứa servlet (Jetty, Tomcat)
  • Một Guice 3 Injector thiết lập như tôi thích nó.
  • An Endpoint xử lý lớp học được chú thích @javax.jws.WebService hiển thị phương thức của tôi dưới dạng dịch vụ web.

Tôi muốn các phương thức dịch vụ web có trường @Inject được xử lý một cách minh bạch hoặc để truy cập vào bộ phun. Tôi có thể lấy nó như một trường tĩnh từ phương pháp chính, nhưng tôi muốn một giải pháp sạch hơn.

Mọi đề xuất?

(Tôi hiểu từ JAX-WS and Guice 3 rằng mô-đun http://jax-ws-commons.java.net/guice/ không làm việc với Guice 3, và thực hiện giải pháp được đề xuất là Tomcat cụ thể)

JSR-250 @Resource chú thích có thể có ích ở đây?

+0

Nó bật ra rằng tôi có thể nhận được bằng cách cho bây giờ bằng cách tiêm một nhà cung cấp trong đối tượng thực hiện như tôi đã làm không cần tiêm sâu lồng nhau. Tiền thưởng được trao cho câu trả lời khiến tôi nhận ra điều này. –

Trả lời

5

Tôi không chắc chắn rằng tôi đã hiểu từng câu hỏi. Dường như quá dễ dàng cho +500 tiền thưởng. Vui lòng đăng một số mã nếu đó không phải là những gì bạn đang tìm kiếm.

Dù sao, một giải pháp đơn giản mà tạo ra một dịch vụ web với dependency injection:

final Module module = new HelloModule(); 
final Injector injector = Guice.createInjector(module); 
final HelloService helloService = injector.getInstance(HelloService.class); 

Endpoint.publish("http://localhost:8080/helloService", helloService); 

Dưới đây là một giải pháp phức tạp hơn với chức năng quét classpath (Reflections) dựa trên mã Marcus Eriksson từ JAX-WS Guice integration. Nó xuất bản tất cả các lớp được chú thích với @GuiceManaged dưới dạng webservice với Endpoint.publish().

private void initGuicedWebservices(final String packageNamePrefix) 
     throws Exception { 
    final Reflections reflections = new Reflections(packageNamePrefix); 
    final Set<Class<?>> guiceManaged = 
     reflections.getTypesAnnotatedWith(GuiceManaged.class); 
    for (final Class<?> clazz : guiceManaged) { 
     doGuice(clazz); 
    } 
} 

private void doGuice(final Class<?> clazz) throws Exception { 
    final GuiceManaged guiceManagedAnnotation = 
     clazz.getAnnotation(GuiceManaged.class); 

    final Injector injector = createInjector(guiceManagedAnnotation); 

    final Object serviceObject = clazz.newInstance(); 
    injector.injectMembers(serviceObject); 

    final String address = guiceManagedAnnotation.address(); 

    Endpoint.publish(address, serviceObject); 
} 

private Injector createInjector(final GuiceManaged guiceManagedAnnotation) 
     throws Exception { 
    final Class<? extends Module>[] moduleClasses = 
     guiceManagedAnnotation.module(); 

    final List<Module> moduleInstances = new ArrayList<Module>(); 
    for (final Class<? extends Module> moduleClass : moduleClasses) { 
     moduleInstances.add(moduleClass.newInstance()); 
    } 

    return Guice.createInjector(moduleInstances); 
} 

Các GuiceManaged chú thích:

@Retention(RUNTIME) 
@Target(TYPE) 
@Documented 
public @interface GuiceManaged { 
    public Class<? extends Module>[] module(); 
    public String address(); 
} 

Và đoạn HelloServiceImpl:

@GuiceManaged(module = HelloModule.class, 
    address = "http://localhost:8080/helloService") 
@WebService 
public class HelloServiceImpl implements HelloService { 

    @Inject // bound in HelloModule 
    public GreetingsService greetingsService; 

    @Override 
    @WebMethod 
    public String sayHello(final String name) { 
     return greetingsService.sayHello(name); 
    } 
} 
+1

Sau khi suy nghĩ một chút về câu trả lời của bạn, tôi nhận ra rằng cơ chế Endpoint không làm bất kỳ cái gì mới, nhưng chỉ cần gọi phương thức chú thích @WebMethod. Điều này có nghĩa rằng tôi có thể nhận được cho bây giờ chỉ bằng cách có các nhà cung cấp tiêm trong trường hợp. Như thường lệ, một số câu hỏi chỉ khó cho đến khi bạn biết cách thực hiện. –

+1

Ngoài ra tôi thường xuyên sử dụng tiền thưởng 500 điểm để thu hút sự chú ý đến một câu hỏi. Nếu những người khác tìm thấy câu hỏi đơn giản và câu trả lời tầm thường, điều đó là tốt với tôi. –

0

bạn cần sử dụng điểm mở rộng AbstractMultiInstanceResolver.

tạo chú thích GuiceManaged;

@Retention(RUNTIME) 
@Target(TYPE) 
@Documented 
@WebServiceFeatureAnnotation(id=GuiceManagedFeature.ID, bean=GuiceManagedFeature.class) 
@InstanceResolverAnnotation(GuiceManagedInstanceResolver.class) 
public @interface GuiceManaged { 
} 

thực hiện GuiceManagedFeature đó là WebServiceFeature:

public class GuiceManagedFeature extends WebServiceFeature { 
    public static final String ID="FEATURE_GuiceManaged"; 

    @FeatureConstructor 
    public GuiceManagedFeature() 
    { 
     this.enabled=true; 
    } 

    public String getID() { 
     return ID; 
    } 
} 

Thực hiện InstanceResolver bằng cách mở rộng AbstractMultiInstanceResolver

public class GuiceManagedInstanceResolver extends AbstractMultiInstanceResolver { 
    private T instance=null; 
    public GuiceManagedInstanceResolver(@NotNull Class clazz) 
    { 
     super(clazz); 
    } 
    public T resolve(@NotNull Packet request) { 
     if(instance==null) 
     { 
      instance=create(); 
      Injector injector= Guice.createInjector(new WebServiceModule()); 
      injector.injectMembers(instance); 
     } 
     return instance; 
    } 
} 

Bây giờ Chú thích dịch vụ của bạn với @GuiceManaged & sử dụng @Inject cho cấp phương pháp DI trên phương thức kinh doanh của bạn .

+0

Bạn có được lấy cảm hứng từ http://developian.blogspot.com/2008/11/google-guice-and-jax-ws.html không? –

+0

@ ThorbjørnRavnAndersen Có, Rất lâu, chúng tôi đã gặp phải vấn đề như bạn và chúng tôi cố gắng sử dụng blog đó làm tài liệu tham khảo, sau đó chúng tôi tìm thấy Guice-Fruit với Guice 2.x. –

+0

Điều này có nghĩa là bây giờ bạn sử dụng Guice-Fruit và phải ở lại với Guice 2 không? –

Các vấn đề liên quan