【发布时间】:2016-06-06 17:35:19
【问题描述】:
我正在尝试实现一个演示 Web 服务,但我遇到了 CDI。我想将FooFinder 注入FooBooker,但我得到的是null(在调用 FooResponse 期间出现 NullPointerException,因为 fooFinder 为空)。
我有一个界面
@RequestScoped
@Named
public interface FooFinder {
FooResponse getReply(String origin, String destination);
}
实现方式
@RequestScoped
@Named
public class MockedFoo implements FooFinder {
@Override
public FooResponse getReply(String origin, String destination) {
String s = "SuperFoo";
Double d = 123.45;
return new FooResponse(origin, destination, s, d);
}
}
在网络服务中
@WebService
public class FooBooker {
@Inject
FooFinder fooFinder;
@WebMethod
public FooResponse getReply(String origin, String destination) {
return fooFinder.getReply(origin, destination);
}
public static void main(String[] argv) {
Object implementor = new FooBooker();
String address = "http://localhost:9000/FooBooker";
Endpoint.publish(address, implementor);
}
}
【问题讨论】:
-
将 webservice 注释为
@Stateless以使其成为 EJB bean,以便可以将其作为 EJB bean 注册到 CDI。此外,您正在从 web 服务调用 main。这不是 Web 服务的设计方式。这应该由具有 EJB 和 CDI 容器的应用程序服务器管理 -
@maress 添加
@Stateless导致加载应用程序时出现异常:CDI 部署失败:WELD-001408:带有限定符@Default 的 FooFinder 类型的依赖关系不满足main()部分来自 Idea WebServices 示例代码。 -
确保
@RequestScoped注释是javax.enterprise.context.RequestScoped而不是javax.faces.bean.RequestScoped
标签: java jakarta-ee jax-ws cdi