Java 泽西岛2.5:替代JResponse?

Java 泽西岛2.5:替代JResponse?,java,rest,generics,jersey,jersey-2.0,Java,Rest,Generics,Jersey,Jersey 2.0,在Jersey 1.9代码中,我们有一个在构建时运行的注释处理器,并生成RESTAPI的文档。它通过查找@path,然后查看已使用的表单bean和JResponse来实现这一点。因为JResponse可以采用类似 public JResponse<MyRepresentation> findMyEntity(Long id) 公共JResponse findMyEntity(长id) API文档生成器将通读类似的方法,查看通用返回类型,并能够基于MyRepresentation反

在Jersey 1.9代码中,我们有一个在构建时运行的注释处理器,并生成RESTAPI的文档。它通过查找@path,然后查看已使用的表单bean和JResponse来实现这一点。因为JResponse可以采用类似

public JResponse<MyRepresentation> findMyEntity(Long id)
公共JResponse findMyEntity(长id)
API文档生成器将通读类似的方法,查看通用返回类型,并能够基于
MyRepresentation
反射地生成响应定义。在Jersey 2.x中,我没有看到类似JResponse的东西


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

这值得吗?

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

我真的很喜欢一个简单的、编译器强制执行的、自文档化的API。它总是同步的,因为如果返回的类型不匹配,编译器会抱怨,不需要代码内注释或外部文档结构。为此,我决定,为了实现API zen,我们可以忍受少量孤立的“黑客行为”,这一点非常重要

尝试解决方案

我的第一个想法是通过
公共类JResponse extends Response
创建一个新的JResponse,但它提供的默认功能几乎为零。因此,在泽西岛的深处,我考虑了
公共类JResponse扩展了OutboundJAXRResponse
。问题仍然是内置的ResponseBuilder是为了生成OutboundJaxrsResponse而构建的,而不是我的通用JResponse。似乎应该有一种方法可以注入您自己的ResponseBuilder,但在添加泛型时,我真的不知道如何做到这一点(如果有人想到了这一点,听起来这可能是一个比我提出的更好的解决方案)

基于许多因素,我最终得到的最终解决方案是一个抽象类扩展
OutboundJAXRResponse
,三个响应代码特定类,
Ok
创建的
,以及作为

// Some resource method
@Path("data/find")
public static Ok<MyDataRep> findData(@Valid MyDataRequestBean form) {
    // find entity etc
    MyDataRep somePojo = ...;
    return Ok.entity(somePojo);
}
这样可以防止类型信息被错误地重写

第三,
Response
pretty中的评论明确要求我们不要这样做:

/**
 * 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.
第四,我认为忽视依赖于泽西岛内部的脆弱性是不公平的,尽管它不会比依赖
JResponse
更脆弱。幸运的是,如果有必要,我们总是可以回到
响应
;该选项仍然可用

结论


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

您使用哪种文档生成器?我们使用Jackson进行Json序列化,他不需要将响应对象包装在JResponse中。@bertvh文档生成器是我们内部开发的东西,如果必须的话,我们可以放弃它。在编写和维护文档/注释方面,Swagger似乎总是需要做更多的工作,而我们自制的工具是从Java代码本身开始工作的。我们使用Jackson进行序列化,正如您所描述的那样。这只会影响我们的文档生成,而不会影响服务器的功能。应该比Swagger更容易设置,您可以删除JResponse。我们提供一个非常有能力的免费版本。也许可以试试?欢迎任何反馈。
/**
 * 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.