java—强制dropwizard/jersey在端点之间进行方法调用,而不是网络调用

o3imoua4  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(363)

假设我有一个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方法调用?

bf1o4zei

bf1o4zei1#

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

31moq8wy

31moq8wy2#

这个 getFizzesByType 呼叫内部 determineWidgetByFoobaz 只是另一个本地方法调用。这些方法没有什么特别之处,您也可以在单元测试中安全地调用它们。
jersey在其引导过程中所做的是扫描带有注解的类 @Path 然后将每个用http方法注解的方法绑定到它的端点(如果有的话)。这样,当有人开枪时 /fizz 简而言之,泽西得到了 FizzResource 例如,打电话给 getFizzesByType 方法,将返回的对象序列化为json,创建适当的http响应并将其发送回客户端。

相关问题