在restful WS中的依赖注入

时间:2012-07-03 15:19:56

标签: java rest dependency-injection ejb jax-ws

我有简单的宁静WS

@Path("basic")
public class ServiceRS
{

   private IServiceJAX service;

   @GET
   @Produces(MediaType.APPLICATION_JSON)
   @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
   public String find(@FormParam("searchRequest") final String searchRequest)
   {
//...
      final List<Info> response = service.find(search);
//...
   }

}  

其中IServiceJAX是jax-webservice的@Local接口。 我可以使用注释将IServiceJAX注入ServiceRS吗? 我不想使用JNDI查找...

1 个答案:

答案 0 :(得分:3)

当然,你可以。虽然我认为还有其他方法,但我已成功运行一个简单的测试项目,@Stateless @WebService@Local实施interface,通过@EJB注入注释到@Stateless注释为@Path的RESTFul Web服务。

根据您的要求,这不是适当的CDI注射,但它运作良好,可能无论如何都符合您的需求。

IServiceJAX 类:

public interface IServiceJAX {
    public String hello(String txt);
}

IServiceJAXImpl 类:

@WebService(serviceName = "NewWebService")
@Local
@Stateless
public class IServiceJAXImpl implements IServiceJAX {

    @WebMethod(operationName = "hello")
    @Override
    public String hello(@WebParam(name = "name") String txt) {
        return "Hello " + txt + " !";
    }
}

ServiceRS 类:

@Path("basic")
@Stateless
public class ServiceRS {

    @EJB private IServiceJAX wsi;

    @GET
    @Path("{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public String result(@PathParam("id") String id) {
        return wsi.hello(id);
    }
}

<强>更新

如果您更喜欢CDI注入,则可以保留上述代码,只需从@Local中删除@StatelessIServiceJAXImpl注释即可。您可以使用以下方法注入此类的实例:

@Inject private IServiceJAX wsi;

而不是

@EJB private IServiceJAX wsi;