How to enable CDI inject in web service (jaxrs/jersey) on java se running grizzly?

前端 未结 3 1506
南笙
南笙 2020-12-03 05:38

How do I allow CDI injection of resources into restful web service resources? I am running on standard java using weld 2 (cdi), jersey (jaxrs), and grizzly (web server). H

3条回答
  •  日久生厌
    2020-12-03 06:19

    After seeing this stackoverflow post, I implemented the following solution. Not sure if it is the best route to take, but it worked.

    I created an hk2 Binder and registered the Binder:

    public class WebServiceBinder extends AbstractBinder {
    
      @Override
      protected void configure() {
        BeanManager bm = getBeanManager();
        bind(getBean(bm, StudentRepository.class))
            .to(StudentRepository.class);
      }
    
      private BeanManager getBeanManager() {
        // is there a better way to get the bean manager?
        return new Weld().getBeanManager();
      }
    
      private  T getBean(BeanManager bm, Class clazz) {
        Bean bean = (Bean) bm.getBeans(clazz).iterator().next();
        CreationalContext ctx = bm.createCreationalContext(bean);
        return (T) bm.getReference(bean, clazz, ctx); 
      }
    }
    

    Then modified the ResourceConfig instantiation from above to:

    final ResourceConfig resourceConfig = new ResourceConfig()
        .packages("training.webservice")
        .register(new JacksonFeature())
        .register(new WebServiceBinder());
    

提交回复
热议问题