java 如何直接从属性文件键设置枚举中的值?

h22fl7wq  于 2023-01-24  发布在  Java
关注(0)|答案(2)|浏览(161)

我一直试图通过在枚举构造函数中插入属性文件中的键来加载字符串值,但它不是设置值,而是只设置键。
我的errorcodes.properties有这个内容
error.id.required.message=Id is required to get the details. error.id.required.code=110
和枚举文件是这样的:

`public enum ErrorCodes {
  ID_REQUIRED("error.id.required.message",
      "error.id.required.code"),
  ID_INVALID("error.id.invalid.message",
      "error.id.invalid.code");

  private final String msg;
  private final String code;

  private ErrorCodes(String msg, String code) {
    this.msg = msg;
    this.code = code;
  }

  public String getMsg() {
    return msg;
  }

  public String getCode() {
    return code;
  }
}`

所以我创建了一个异常,它将上面定义的枚举之一作为参数,并抛出一个自定义异常,消息为“需要ID来获取细节”,代码为“110”。
例如,throw new CustomException(ErrorCodes.ID_REQUIRED)
但得到的回应却是

"errorCode": "error.id.required.code"
"errorMessage": "error.id.required.message"

帮帮忙!谢谢。

hgb9j2n6

hgb9j2n61#

一般来说,像这样使用Enum不是个好主意,记住,枚举的常量是单例的,因此你不能像这样使用它。
我认为最好有单独的类,在那里你可以封装这个逻辑:

  • 读取属性文件
  • 获取一个Enum并仅从文件中检索相关数据
  • 声明两个Map,以便按ErrorCode保存messagecode
  • 通过ErrorCode检索messagecode的吸气器
  • ErrorCodeErrorCodeStore应位于同一软件包中

这是一个枚举ErrorCode

@lombok.RequiredArgsConstructor(access = AccessLevel.PACKAGE)
public enum ErrorCode {

    ID_REQUIRED("error.id.required.message", "error.id.required.code"),
    ID_INVALID("error.id.invalid.message", "error.id.invalid.code");

    final String message;
    final String code;

    public final String getMessage() {
        return ErrorCodeStore.getInstance().getValue(message);
    }

    public final String getCode() {
        return ErrorCodeStore.getInstance().getValue(code);
    }

}

这是ErrorCodeStore

@lombok.RequiredArgsConstructor(access = AccessLevel.PRIVATE)
final class ErrorCodeStore {

    private static ErrorCodeStore instance;

    public static ErrorCodeStore getInstance() {
        if (instance == null)
            throw new RuntimeException("ErrorCodeStore instance should be"
                                               + " initialized");
        return instance;
    }

    private final Properties properties;

    // InputStream should be explicitly closed
    public static ErrorCodeStore initFrom(InputStream in) throws IOException {
        Properties properties = new Properties();
        properties.load(in);

        return instance = new ErrorCodeStore(properties);
    }

    String getValue(String key) {
        return properties.getProperty(key, key);
    }

}
    • 演示**
public static void main(String[] args) throws IOException {
    ErrorCodeStore.initFrom(Main.class.getResourceAsStream("/errorcodes.properties"));
    System.out.println(ErrorCode.ID_REQUIRED.getMessage()); // Id is required to get the details.
    System.out.println(ErrorCode.ID_REQUIRED.getCode());    // 110
    System.out.println(ErrorCode.ID_INVALID.getMessage());  // error.id.invalid.message
    System.out.println(ErrorCode.ID_INVALID.getCode());     // error.id.invalid.code
}
6bc51xsx

6bc51xsx2#

若要修复此问题,必须加载属性文件,并使用传递给枚举构造函数的键检索值。
您可以使用java.util.Properties类加载属性文件并检索值。下面是一个示例,说明如何修改代码以从属性文件加载值:

public enum ErrorCodes {
  ID_REQUIRED("error.id.required"),
  ID_INVALID("error.id.invalid");

  private final String msg;
  private final String code;

  static {
    properties = new Properties();
    RuntimeException initError;
    try {
      InputStream input = ErrorCodes.class.getResourceAsStream("errorcodes.properties")
      properties.load(input);
    } catch (IOException e) {
     initError = RuntimeException initError = new RuntimeException("Unhandled Error: ", e)
    }
  }

  private ErrorCodes(String key) {
    this.msg = key + ".message";
    this.code = key + ".code";
  }

  public String getMsg() {
    return getProperty(msg);
  }

  public String getCode() {
    return getProperty(code);
  }

  private static String getProperty(String key) {
    if (initError != null) {
      throw initError;
    }
    return properties.getProperty(key);
  }
}

通过这种方式,枚举构造函数获取属性的键并使用它从属性文件中查找值。
顺便说一句,您还应该确保errorcodes.properties位于应用程序的类路径中。

相关问题