gpt4 book ai didi

java - Jersey 2.5 : Replacement for JResponse?

转载 作者:搜寻专家 更新时间:2023-11-01 03:23:44 37 4
gpt4 key购买 nike

在我们的 Jersey 1.9 代码中,我们有一个注释处理器,它在构建时运行并生成我们的 REST API 的文档。它通过查找 @Paths 然后查看已使用的表单 bean 和 JResponses 来完成此操作。因为 JResponse 可以采用像

这样的泛型
public JResponse<MyRepresentation> findMyEntity(Long id)

API 文档生成器将通读类似的方法,查看通用返回类型,并能够基于 MyRepresentation 反射式生成响应定义。在 Jersey 2.x 中,我看不到 JResponse 之类的东西。

是否有可用于 Jersey 2.x 资源方法的类似通用返回/响应类型?

最佳答案

这值得吗?

在没有真正得到满意的答案之后,我开始假设没有其他人真正使用过这个功能,他们没有因为失去它而难过,或者根本没有令人满意的答案。

我真的很喜欢一个简单的、编译器强制执行的、自记录 API 的想法。它总是同步的,因为如果您返回的类型不匹配,编译器会报错,不需要代码内注释或外部文档结构。为此,我认为重要的是我们可以忍受少量孤立的“hackiness”以实现 API zen。

尝试解决方案

我的第一个想法是通过 public class JResponse<E> extends Response 创建一个新的 JResponse ,但它几乎没有提供默认功能。所以,深入 Jersey ,我考虑了public class JResponse<E> extends OutboundJaxrsResponse .问题仍然是内置的 ResponseBuilder 是为生成 OutboundJaxrsResponse 而构建的,而不是我的通用 JResponse。似乎应该有一种方法可以注入(inject)您自己的 ResponseBuilder,但我无法真正弄清楚如何在 添加泛型时做到这一点(如果有人弄清楚了,这听起来像是这可能是比我提出的更好的解决方案)。

基于多种因素,我最终得出的最终解决方案是一个扩展 OutboundJaxrsResponse 的抽象类和三个响应代码特定类,Ok<E> , Created<E> , 和 NoContent调用为

// Some resource method
@Path("data/find")
public static Ok<MyDataRep> findData(@Valid MyDataRequestBean form) {
// find entity etc
MyDataRep somePojo = ...;
return Ok.entity(somePojo);
}

事实证明,我们在实践中使用了非常少量的整体 Response API(只有 200、201 和 204 用于成功代码,没有 300,所有 400+ 通过抛出的异常)这意味着重做整个构建器模式没有必要。最后,结果是

Ok: static empty, static entity(E 实体)创建:静态uri,实例实体(E实体)NoContent:静态空

创建的示例是 return Created.uri(someBuiltUri).entity(somePojo);

缺点

不讨论存在的缺点是不公平的,其中有几个主要缺点。

首先,由于 Response 仍然是一个祖先(根据 Jersey 的要求),所有 Response 静态方法都是可见的并显示在 IDE 自动完成中。自 Ok.ok()不匹配 Ok<E> , 在您熟悉我在这里创建的方言之前,可能很难意识到出了什么问题。这可以通过工厂解决,但会增加复杂性。

其次,在 Jersey 的内部结构中有一个地方试图确保在您返回任何泛型时使用正确的类型。有一张支票说“如果这是一个响应实例,请不要检查”,但我相信它有问题。结果是 Jersey 错误地破坏了你的类型然后爆炸了。为了解决这个问题,我必须执行以下操作:

public static class CustomOutboundMessageContext extends OutboundMessageContext {
@Override
public void setEntityType(Type type) {}
}

这可以防止类型信息被错误地重写。

三、Response中的评论非常明确地要求我们不要这样做:

/**
* An application class should not extend this class directly. {@code Response} class is
* reserved for an extension by a JAX-RS implementation providers. An application should use one
* of the static methods to create a {@code Response} instance using a ResponseBuilder.

第四,我认为忽略依赖 Jersey 内部结构的脆弱性是不公平的,尽管它不能比依赖 JResponse 更脆弱。首先。幸运的是,我们总能回到Response如果我们不得不;该选项仍然可用。

结论

这些更改在我们的特定项目中非常容易使用,并且允许我们生成 API 定义而无需维护注释。总的来说,我仍然觉得这对我们来说是值得的,但我不能推荐这是一个理想的解决方案。

关于java - Jersey 2.5 : Replacement for JResponse?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21321223/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com