我正在开发一个项目,在该项目中,我使用 RestTemplate
调用我的一台服务器,该服务器正在运行静态服务并从它们那里获取响应。
如果出现问题,我将从服务器获得的响应可以是这些错误响应中的任何一个(这就是我所有的错误响应) -
{"warning": "user_id not found", "user_id": some_user_id}
{"error": "user_id for wrong partition", "user_id": some_user_id, "partition": some_partition}
{"error": "missing client id", "client_id":2000}
或以下成功响应(可以是任意随机 json 字符串, key 也可以不同)-
{"@data": {"oo":"1205000384","p":"2047935"}
- 如果我收到上述任何错误响应,那么我将对其进行反序列化(我的错误 :( ),以便我可以将它们记录为带有特定
error
或warning 的错误
我得到了服务器,例如 -user_id not found
或missing client id
。 - 如果这是一个成功的响应,那么我也会反序列化它,我的用例不需要它,因为我们没有任何 POJO,我只需要返回响应,因为它是我从服务器。
在我的用例中,如果这是一个成功的响应,我不需要反序列化我的响应字符串,因为我们没有任何 POJO,并且我们将返回响应字符串,因为它是我们从服务器。但只是为了记录特定的错误消息(如果我从服务器收到错误响应),我将其反序列化,我认为这是不必要的。对于我的用例可能有更好的解决方案。
下面是我的 Java 客户端,它使用 future.get
调用 Callable
任务 -
public class TestingClient implements IClient {
private ExecutorService service = Executors.newFixedThreadPool(10);
private RestTemplate restTemplate = new RestTemplate();
@Override
public String executeSync(ClientKey keys) {
String response = null;
try {
ClientTask ClientTask = new ClientTask(keys, restTemplate);
Future<String> future = service.submit(ClientTask);
response = handle.get(keys.getTimeout(), TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
} catch (Exception e) {
}
return response;
}
}
现在下面是我的 ClientTask
类,它实现了 Callable 接口(interface)。在调用方法中,我生成一个 URL,然后使用 RestTemplate
访问服务器并获取响应 -
class ClientTask implements Callable<String> {
private ClientKey cKeys;
private RestTemplate restTemplate;
public ClientTask(ClientKey cKeys, RestTemplate restTemplate) {
this.restTemplate = restTemplate;
this.cKeys = cKeys;
}
@Override
public String call() throws Exception {
// .. some code here
String url = "some_url";
String response = restTemplate.getForObject(url, String.class);
String test = checkJSONResponse(response);
return test;
}
private String checkJSONResponse(final String response) throws Exception {
// may be there are some better way of doing it for my scenario instead of using GSON
Gson gson = new Gson();
String str = null;
JsonObject jsonObject = gson.fromJson(response, JsonObject.class); // parse it, may be performance issues here/
if (jsonObject.has("error") || jsonObject.has("warning")) {
final String error = jsonObject.get("error") != null ? jsonObject.get("error").getAsString() : jsonObject
.get("warning").getAsString();
// log specific `error` here using log4j
str = response;
} else {
str = response;
}
return str;
}
}
正如您在上面的代码中看到的,我们反序列化 JSON 字符串只是为了在收到任何错误响应时记录特定的错误消息。但为了成功响应,我们不需要任何反序列化,但我们仍然在这样做。
有没有更好的方法来解决这个问题?因为目前我发现 GSON 反序列化存在一些性能问题。
我可以识别成功响应和错误响应的唯一方法是在响应中使用错误
或警告
,因此我正在考虑使用可以识别错误或错误的正则表达式warning 作为响应字符串中的键。如果响应字符串中包含错误或警告,则提取特定的错误或警告消息并记录它。
我想可能有一些更好的方法可以解决这个问题,而无需支付反序列化的成本。
最佳答案
我认为仅仅依赖正则表达式是危险的。如果服务器稍微改变输出格式怎么办?
我会尝试进行快速测试,可能使用一个简单的正则表达式来查找字符串 "error"
如果有可能它是一个错误响应,请执行完整的反序列化以确定它是否确实是一个错误。
只有当定期响应偶然触发快速检查时,您才需要为误报支付额外费用。
关于java - 如何使用正则表达式来识别JSON字符串中的错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21366491/