我正在尝试通过OSGi公开REST服务(使用Apache Felix)。我正在使用osgi-jax-rs-connector发布资源。这是资源接口:
@Path("/bingo")
public interface BingoService {
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/lottery")
List<Integer> getLottery();
}
该实现使用DS注释来获取对容器中提供的服务的引用:
@Component(
immediate = true,
service = BingoService.class,
properties = "jersey.properties")
public class Bingo implements BingoService {
@Reference
private RandomNumberGenerator rng;
@Activate
public void activateBingo() {
System.out.println("Bingo Service activated using " +
rng.getClass().getSimpleName());
}
@Override
public List<Integer> getLottery() {
List<Integer> result = new ArrayList<>();
for (int i = 5; i > 0; i--) {
result.add(rng.nextInt());
}
return result;
}
}
jersey.properties只包含这一行
service.exported.interfaces=*
当我部署捆绑包时,它会启动并正确注册服务。但是,如果我去http://localhost:8181/services/bingo/lottery,我会得到404.有人能指出我这个问题或者给我一些关于在哪里看的建议吗?
在阅读OSZi -JAX-RS Connector的documentation时,它希望在服务实例对象上找到注释@Path
或@Provider
。您已将它们放置在组件实现的接口上。
我不确定BingoService
界面的用途是什么。这不是JAX-RS服务所必需的。通常,您将使用自己的类型(例如service=Bingo.class
)或简单地使用java.lang.Object
来注册资源类。