在restful WS中的dependency injection
我有简单的宁静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 response = service.find(search); //... } }
其中IServiceJAX
是jax-webservice的@Local
接口。 我可以使用注释将IServiceJAX
注入ServiceRS
吗?
我不想使用JNDI查找…
你当然可以。 虽然我认为还有其他方法,但我已经成功运行了一个简单的测试项目,其中包含@Stateless
@WebService
, interface
@Local
实现,通过@EJB
注释注入到@Path
注释的@Stateless 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); } }
UPDATE
如果你更喜欢CDI注入,你可以保留上面的代码,只需从IServiceJAXImpl
删除@Local
和@Stateless
注释。 您可以使用以下方法注入此类的实例:
@Inject private IServiceJAX wsi;
代替
@EJB private IServiceJAX wsi;