【问题标题】:Dependency injection in restful WSRESTful WS 中的依赖注入
【发布时间】:2012-07-04 01:43:00
【问题描述】:
我有简单宁静的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 查找...
【问题讨论】:
标签:
java
rest
dependency-injection
ejb
jax-ws
【解决方案1】:
当然可以。虽然我认为还有其他方法,但我已经成功运行了一个简单的测试项目,其中包含 @Stateless @WebService、@Local 实现 interface,通过 @EJB 注解注入 @Stateless RESTFul Web 服务注解@Path。
这不是您所要求的正确的 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 注入,您可以保留上面的代码,只需从 IServiceJAXImpl 中删除 @Local 和 @Stateless 注释即可。您可以使用以下方法注入此类的实例:
@Inject private IServiceJAX wsi;
而不是
@EJB private IServiceJAX wsi;