【发布时间】:2015-04-10 21:03:24
【问题描述】:
我正在尝试在errorMessage 中查找来自messages.properties 的字符串,如果errorMessage 有字符串,我需要将其替换为相应的值
我有messages.properties 如下
inv_date=INVOICE DATE
inv_id=INVOICE NUMBER
cl_id=CLIENT ID
lf_matter_id=LAW FIRM MATTER ID
inv_total_net_due=INVOICE TOTAL
(inv_start_date|invoice start date)=BILLING START DATE
(inv_end_date|invoice end date)=BILLING END DATE
inv_desc=INVOICE DESCRIPTION
units=LINE ITEM NUMBER OF UNITS
discount_amount=LINE ITEM ADJUSTMENT AMOUNT
total_amount=LINE ITEM TOTAL
(charge_date|charge date)= LINE ITEM DATE
acca_task=LINE ITEM TASK CODE
acca_expense=LINE ITEM EXPENSE CODE
acca_activity= LINE ITEM ACTIVITY CODE
(tk_id|time keeper id)=TIMEKEEPER ID
charge_desc=LINE ITEM DESCRIPTION
lf_id=LAW FIRM ID
(BaseRate|Rate|tk_rate)=LINE ITEM UNIT COST
tk_level=TIMEKEEPER CLASSIFICATION
cl_matter_id=CLIENT MATTER ID
我的errorMesage 可以有任何(左侧)字符串,我需要用右侧字符串值替换它
以下是几个示例错误消息
String errorMesage1 = "Line 3 : Could not parse inv_date value"
String errorMesage2 = "Line : 1 BaseRate is a required field"
下面是我转换错误信息的方法
public static String toUserFriendlyErrorMessage(String message) {
ResourceBundle rb = ResourceBundle.getBundle("messages");
for(String key : rb.keySet()){
String header = rb.getString(key);
if(message.contains(key)) {
return message.replaceAll(key, rb.getString(key));
}
}
return message;
}
以下是预期的输出: 对于errorMessage1,它工作正常
System.out.println(toUserFriendlyErrorMessage(errorMessage1)); ==> Line 3 : Could not parse INVOICE DATE value
但是对于 errorMessage2 它不起作用。它不会用LINE ITEM UNIT COST 替换BaseRate
System.out.println(toUserFriendlyErrorMessage(errorMessage2)); ==> Line : 1 BaseRate is a required field
有没有办法找到多个字符串的出现并将其替换为对应的值?
例如:找到(BaseRate|Rate|tk_rate)并将字符串替换为LINE ITEM UNIT COST
我也想知道这个方法可以在 java 8 中进一步简化吗?
【问题讨论】:
-
为什么在属性文件中没有一个 BaseRate 条目(另一个是 Rate 条目,另一个是 tk_rate 条目)。为什么要使用 ResourceBundle(它应该有助于国际化),而不是 java.util.Properties?为什么要使用replaceAll(),它接受一个正则表达式作为参数,而不是replace(),它接受一个简单的String?
-
@JBNizet 我只是想消除冗余,所以我尝试将 BaseRate,Rate,tk_rate 组合在一起。还有什么更好的方法来处理这个没有 ResourceBundle 的属性文件?
-
正如我所说:属性。消除冗余并不会带来显着的优势,并且会使您的代码更加复杂。让事情变得简单明了。
-
好的,我将为 BaseRate、Rate、tk_rate 设置单独的值。那么在 java 8 中可以进一步简化吗?
-
我认为您应该重新考虑您的设计并为多个“别名”使用单独的键。问题是这些属性文件中的键不应该包含空格——不管是否有括号——所以这些文件没有被正确解析。如果您打印密钥,您会看到它们在第一个空格处被截断,例如
(inv_start_date|invoice.