【问题标题】:Combine multiple annotations into one to avoid repeating them将多个注释合并为一个以避免重复
【发布时间】:2013-06-11 13:46:42
【问题描述】:

我正在使用 Spring MVC 实现各种 REST 服务。对于文档,我使用的是 Swagger。

这很好用,文档看起来不错,而且非常实用。我唯一的问题是文档注释确实挤满了控制器类,尤其是错误代码注释。

例子:

@ApiErrors(value = {
    @ApiError(code = 123, reason = "Reason123"),
    @ApiError(code = 124, reason = "Reason124"),
    @ApiError(code = 125, reason = "Reason125"),
    @ApiError(code = 126, reason = "Reason126"),
    @ApiError(code = 127, reason = "Reason127") })
public void exampleFunctionImplementation() {
}

在许多情况下,这会导致大量注释,其中真正的应用程序代码隐藏在两者之间。另外,这个注解集经常重复,因为很多方法可能返回相同的错误码集。

是否有任何选项可以通过在其他地方将注释列表定义为另一个类文件中的常量来缩短这一点?或者我可能忽略了一些更简单的东西?

我尝试在某处定义 @ApiError 项目数组,但这不会编译:

ApiError[] array = {ApiError(code = 123, reason = "Reason123")};

如果有人能给我一个提示如何解决这个问题,我会很高兴,在此先感谢!

【问题讨论】:

标签: java spring-mvc annotations swagger


【解决方案1】:

注释成员只有有限的类型 (JLS 9.6)。

如果在注解类型中声明的方法的返回类型不是以下之一,则为编译时错误:原始类型、字符串、类、对 Class 的任何参数化调用、枚举类型(第 8.9 节) 、注释类型或数组类型(第 10 节),其元素类型是上述类型之一。

它们的值必须是常量表达式 (JLS 9.7)。该标准使用术语commensurate

T 是一个数组类型 E[] 和:

V 是一个 ElementValueArrayInitializer,V 中的每个 ElementValue(类似于数组初始值设定项中的 VariableInitializer)都与 E 相称;或

V 是与 E 相称的 ElementValue。

V 的类型与 T 的赋值兼容(第 5.2 节),此外:

如果 T 是原始类型或字符串,而 V 是常量表达式(第 15.28 节)。

V 不为空。

如果 T 是 Class,或 Class 的调用,而 V 是类文字(第 15.8.2 节)。

如果 T 是枚举类型,而 V 是枚举常量。

您的数组不是常量表达式,因此您的代码无法编译。如果您预计会有很大的注释列表,也许还有另一种方法可以完成此任务。我不认识 Swagger,所以你可能无法避免这种情况。

【讨论】:

  • 真可惜 - 不知何故,我希望有一个聪明的方法来解决这个问题,以某种方式重用一组注释:-(
  • @EricJablow,这个新功能很好,但无济于事。因为主题启动器不想在方法之间复制注释。他宁愿将繁琐的注解定义一次,并将其应用于其他方法。我对 Swagger 也有同样的问题。
猜你喜欢
  • 2018-04-20
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多