我有自己的 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 中的线程中的一些建议,但失败了。有一种方法可以将枚举重写为接口,但我想避免它。
您可以将 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))
编译器不知道枚举中的值是常量。但是,有一个解决方法:您可以将枚举值本身设置为常量:
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))
如果您可以控制注释,则可以传递枚举本身,并在运行时进行代码/消息查找。