Java注解中如何使用枚举字段传递错误码?
问题解决:注解中使用枚举错误码避免硬编码
问题原因
Java注解的属性值必须是编译时常量表达式,ErrorMessages.NO_USER.getCode()是方法调用,即便枚举的code是final修饰的成员变量,方法调用也不属于编译时常量范畴,因此编译器会抛出Attribute value must be constant错误。
可行解决方案
在枚举类中定义对应的静态编译时常量,让枚举实例引用这些常量,同时注解直接使用常量值,既保留枚举的结构,又避免重复硬编码:
修改后的枚举类
public enum ErrorMessages { NO_USER(NO_USER_CODE, "User not found"), UNKNOWN_MODULE(UNKNOWN_MODULE_CODE, "Module unknown"), INCORRECT_DATE(INCORRECT_DATE_CODE, "Incorrect date"); // 定义编译时常量,供注解直接引用 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 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; } }
修改后的注解用法
@JsonRpcMethod("MyMethod") @JsonRpcErrors(@JsonRpcError(exception = UserNotFoundException.class, code = ErrorMessages.NO_USER_CODE)) boolean myMethod( @JsonRpcParam("userId") Integer userId, @JsonRpcParam("apiKey") String apiKey) throws UserNotFoundException;
方案优势
- 无需将枚举改为接口,保留原有枚举的封装性和语义化
- 错误码仅在枚举的静态常量处定义一次,避免重复硬编码导致的不一致问题
- 完全符合Java注解对编译时常量的要求,编译通过无报错
内容的提问来源于stack exchange,提问作者r2r
相关产品推荐
相关产品推荐

