强制Dropwizard / Jersey在端点之间进行方法调用而不是网络调用

时间:2016-03-28 15:48:03

标签: java rest jersey dropwizard loopback

假设我有一个像这样定义的Dropwizard / Jersey资源:

// Pseudo-code
@Path("/fizz")
@Produces(MediaType.APPLICATION_JSON)
class FizzResource {
    FizzDao fizzDao

    @GET
    List<Fizz> getFizzesByType(@PathParam("type") String type) {
        // Do some stuff up here
        return fizzDao.getFizzesByType(type)
    }

    @POST
    Widget determineWidgetByFoobaz(@PathParam("foobaz") String foobaz) {
        // Do some stuff

        List<Fizz> fizzes = getFizzesByType(foobaz.type)
        Widget w = new Widget(fizzes, true, blah)
        // Do some more stuff

        return w
    }
}

当我从另一个端点(getFizzesByType)内部调用一个端点(determineWidgetByFoobaz)时会发生什么?

框架是否知道只是调用Java方法?或者是实际的网络调用(到localhost / loopback / etc。)?如果进行了网络调用,框架是否提供了任何配置它的方法,以便只调用本地Java方法调用?

2 个答案:

答案 0 :(得分:2)

如果您将端点作为方法(即this.getFizzesByType(type))进行访问,那么它将像任何其他Java方法一样被调用。如果您通过URI(例如ClientBuilder.newClient().target("http://localhost/fizz/" + type).request().get())访问它,那么它将作为网络资源进行访问。

答案 1 :(得分:1)

getFizzesByType内的determineWidgetByFoobaz调用只是另一个本地方法调用。这些方法没有什么特别之处,你也可以安全地打电话给我们,比方说,单元测试。

Jersey在其上执行的引导过程是扫描用@Path注释的类,然后将用HTTP方法注释的每个方法绑定到它的端点(如果有的话)。这样,当有人向/fizz发起GET时,简而言之,泽西获得一个FizzResource实例,调用它的getFizzesByType方法,将返回的对象序列化为JSON,创建适当的HTTP响应并将其发送回客户端。