如何在java中的注释中使用枚举字段

问题描述 投票:0回答:2

我有自己的 ErrorMessages 枚举,简单地说:

public enum ErrorMessages {
  NO_USER(1004, "User not found"),
  UNKNOWN_MODULE(1006, "Module unknown"),
  INCORRECT_DATE(1009, "Incorrect date");

  public final int code;
  private final String messageEng;

  ErrorMessages(int code, String messageEng) {
    this.code = code;
    this.messageEng = messageEng;
  }

  public int getCode() {
    return code;
  }

  public String getMessageEng() {
    return messageEng;
  }
}

我想将错误代码传递给我的 json-rpc api 方法,如下所示:

@JsonRpcMethod("MyMethod")
  @JsonRpcErrors(@JsonRpcError(exception = UserNotFoundException.class, code = ErrorMessages.NO_USER.getCode()))
  boolean myMethod(
      @JsonRpcParam("userId") Integer userId, @JsonRpcParam("apiKey") String apiKey)
      throws UserNotFoundException;

但是我收到错误

Attribute value must be constant
。 我知道值应该在编译时传递给注释,但我认为在我的情况下它已经是已知的。 有什么方法可以通过从 ErrorMessages 枚举中获取错误代码来传递错误代码吗?如果已经声明了代码,那么对它们进行硬编码是非常愚蠢的。

我尝试应用我发现的 sof 中的线程中的一些建议,但失败了。有一种方法可以将枚举重写为接口,但我想避免它。

java enums annotations
2个回答
1
投票

您可以将 int 代码移至单独的类中:

public static class ErrorMessagesValues {
    public static final int NO_USER_CODE = 1004;
    public static final int UNKNOWN_MODULE_CODE = 1006;
    public static final int INCORRECT_DATE_CODE = 1009;
}

然后在两个枚举中引用这些常量:

public enum ErrorMessages {
    NO_USER(ErrorMessagesValues.NO_USER_CODE, "User not found"),
    UNKNOWN_MODULE(ErrorMessagesValues.UNKNOWN_MODULE_CODE, "Module unknown"),
    INCORRECT_DATE(ErrorMessagesValues.INCORRECT_DATE_CODE, "Incorrect date");

    ...
}

和注释:

@JsonRpcMethod("MyMethod")
@JsonRpcErrors(@JsonRpcError(exception = UserNotFoundException.class, code = ErrorMessagesValues.NO_USER_CODE))

1
投票

编译器不知道枚举中的值是常量。但是,有一个解决方法:您可以将枚举值本身设置为常量:

public enum ErrorMessages {
  NO_USER(NO_USER_CODE, "User not found"),
  // etc
  ;

  public static final int NO_USER_CODE = 1004;
  // etc
}

然后引用注释中的常量:

  @JsonRpcErrors(@JsonRpcError(exception = UserNotFoundException.class, code = ErrorMessages.NO_USER_CODE))

如果您可以控制注释,则可以传递枚举本身,并在运行时进行代码/消息查找。

© www.soinside.com 2019 - 2024. All rights reserved.