JSON 对象不正确并导致 HttpException
JSON Object incorrect and causing HttpException
我正在尝试测试这个方法:
private ServiceApiMetadata getConfig(final HttpServletRequest request, final String path)
throws IOException {
final Schema schema;
try (final InputStream inStream = this.getClass().getResourceAsStream(path)) {
final JSONObject origSchema = new JSONObject(new JSONTokener(inStream));
if (isGoldStar()) {
origSchema.getJSONObject("properties")
.getJSONObject("notifications")
.getJSONObject("properties")
.getJSONObject("topic")
.put("pattern", "^[0-9A-Za-z-.]*$");
}
schema = SchemaLoader.load(origSchema);
}
final ServiceApiMetadata config;
try (final BufferedReader reader = request.getReader()) {
final JSONObject json = new JSONObject(new JSONTokener(reader));
schema.validate(json);
config = ServiceApiMetadata.read(json);
} catch (final ValidationException e) {
_logger.debug(e.getMessage());
if (e.getLocation().contains("#/properties/notifications")) {
throw new ServiceApiException(ServiceApiError.MALFORMED_NOTIFICATIONS_ERROR,
ServiceApiErrorMessage.MALFORMED_JSON);
} else {
throw new ServiceApiException(ServiceApiError.MALFORMED_JSON);
}
} catch (final JSONException e) {
_logger.debug(e.getMessage());
throw new ServiceApiException(ServiceApiError.MALFORMED_JSON);
}
return config;
}
因为它是私有的,所以我在 class 中创建了以下方法:
@TestOnly
protected void runGetConfig(final HttpServletRequest request, final String schemaPath) throws IOException {
final ServiceApiMetadata conf = getConfig(request, schemaPath);
}
当我 运行 我的测试 getConfig()
抛出异常。问题是当行 final JSONObject json = new JSONObject(new JSONTokener(reader));
我得到这个异常:
HttpException(400,{"status_code":400,"error_code":"MalformedJson","uri":"uri","message":"MalformedJson"},null)
我在日志中也看到了这个错误:
at 0 [character 1 line 1]
对于 HttpServletRequest,我使用 org.springframework.mock.web.MockHttpServletRequest.MockHttpServletRequest()
如下:
final MockHttpServletRequest request = new MockHttpServletRequest();
这是否可能导致 reader
不正确,这又意味着 JSONObject
不正确,如果是,我该如何解决?
附加信息
我在 MockHttpServletRequest
中添加了正文,但问题仍然存在。我添加了一些日志记录,如下所示:
final JSONObject rawSchema = new JSONObject(new JSONTokener(inputStream));
_logger.info("rawSchema: " + rawSchema);
if (isPulsar()) {
rawSchema.getJSONObject("properties")
.getJSONObject("notifications")
.getJSONObject("properties")
.getJSONObject("topic")
.put("pattern", "^[0-9A-Za-z-._:/]*$");
}
schema = SchemaLoader.load(rawSchema);
}
final ServiceApiContainerMetadata conf;
try (final BufferedReader reader = request.getReader()) {
_logger.info("reader: " + reader);
_logger.info("JSONTokener(reader): " + new JSONTokener(reader.readLine()));
final JSONObject json = new JSONObject(new JSONTokener(reader.readLine()));
它在输出中显示了这个:
rawSchema: {VALID JSON STRUCTURE. IT'S TOO BIG TO INCLUDE IN THIS QUESTION}
reader: java.io.BufferedReader@4c4d27c8
JSONTokener(reader): at 0 [character 1 line 1]
有关 MockHttpServletRequest 的信息
我的 MockHttpServletRequest
正文包含 Lorem ipsum 文本。如果我在我的 BufferedReader 下面添加以下代码,该文本将打印到控制台。 ``final JSONObject json = new JSONObject(new JSONTokener(reader.readLine()));so the malformed JSON error in my
HttpException` 不足为奇。
while ((strCurrentLine = reader.readLine()) != null) {
_logger.info("reader: " + strCurrentLine);
}
这可能是我代码中的错误吗? final JSONObject json = new JSONObject(new JSONTokener(reader.readLine()));
实际上应该是 final JSONObject json = new JSONObject(schema);
吗?如果我尝试我可以看到代码现在达到 schema.validate(json);
但有 12 schema violations found
。我看不出这些是什么。另一个想法是 body 应该是 JSON?
我将正文更新为 JSON,这导致了 2 个验证错误。一个是缺少 service_id
而 testkey
存在,所以我解决了这个问题,当我使用 final JSONObject json = new JSONObject(new JSONTokener(reader));
.
时,我的方法不再抛出异常
如果你只是 request = new MockHttpServletRequest();
那么请求将没有正文并且 reader 将没有数据。
您可以使用 MockMvcRequestBuilders 创建一个完整的请求。
request = MockMvcRequestBuilders.get("/message")
.contentType(MediaType.TEXT_PLAIN)
.content("{... json body ...}")
.buildRequest(context);
为了解决这个问题,我在正文 JSON 中添加了一个 notifications
键。这允许 final JSONObject json = new JSONObject(new JSONTokener(reader.readLine())); to work
.
我正在尝试测试这个方法:
private ServiceApiMetadata getConfig(final HttpServletRequest request, final String path)
throws IOException {
final Schema schema;
try (final InputStream inStream = this.getClass().getResourceAsStream(path)) {
final JSONObject origSchema = new JSONObject(new JSONTokener(inStream));
if (isGoldStar()) {
origSchema.getJSONObject("properties")
.getJSONObject("notifications")
.getJSONObject("properties")
.getJSONObject("topic")
.put("pattern", "^[0-9A-Za-z-.]*$");
}
schema = SchemaLoader.load(origSchema);
}
final ServiceApiMetadata config;
try (final BufferedReader reader = request.getReader()) {
final JSONObject json = new JSONObject(new JSONTokener(reader));
schema.validate(json);
config = ServiceApiMetadata.read(json);
} catch (final ValidationException e) {
_logger.debug(e.getMessage());
if (e.getLocation().contains("#/properties/notifications")) {
throw new ServiceApiException(ServiceApiError.MALFORMED_NOTIFICATIONS_ERROR,
ServiceApiErrorMessage.MALFORMED_JSON);
} else {
throw new ServiceApiException(ServiceApiError.MALFORMED_JSON);
}
} catch (final JSONException e) {
_logger.debug(e.getMessage());
throw new ServiceApiException(ServiceApiError.MALFORMED_JSON);
}
return config;
}
因为它是私有的,所以我在 class 中创建了以下方法:
@TestOnly
protected void runGetConfig(final HttpServletRequest request, final String schemaPath) throws IOException {
final ServiceApiMetadata conf = getConfig(request, schemaPath);
}
当我 运行 我的测试 getConfig()
抛出异常。问题是当行 final JSONObject json = new JSONObject(new JSONTokener(reader));
我得到这个异常:
HttpException(400,{"status_code":400,"error_code":"MalformedJson","uri":"uri","message":"MalformedJson"},null)
我在日志中也看到了这个错误:
at 0 [character 1 line 1]
对于 HttpServletRequest,我使用 org.springframework.mock.web.MockHttpServletRequest.MockHttpServletRequest()
如下:
final MockHttpServletRequest request = new MockHttpServletRequest();
这是否可能导致 reader
不正确,这又意味着 JSONObject
不正确,如果是,我该如何解决?
附加信息
我在 MockHttpServletRequest
中添加了正文,但问题仍然存在。我添加了一些日志记录,如下所示:
final JSONObject rawSchema = new JSONObject(new JSONTokener(inputStream));
_logger.info("rawSchema: " + rawSchema);
if (isPulsar()) {
rawSchema.getJSONObject("properties")
.getJSONObject("notifications")
.getJSONObject("properties")
.getJSONObject("topic")
.put("pattern", "^[0-9A-Za-z-._:/]*$");
}
schema = SchemaLoader.load(rawSchema);
}
final ServiceApiContainerMetadata conf;
try (final BufferedReader reader = request.getReader()) {
_logger.info("reader: " + reader);
_logger.info("JSONTokener(reader): " + new JSONTokener(reader.readLine()));
final JSONObject json = new JSONObject(new JSONTokener(reader.readLine()));
它在输出中显示了这个:
rawSchema: {VALID JSON STRUCTURE. IT'S TOO BIG TO INCLUDE IN THIS QUESTION}
reader: java.io.BufferedReader@4c4d27c8
JSONTokener(reader): at 0 [character 1 line 1]
有关 MockHttpServletRequest 的信息
我的 MockHttpServletRequest
正文包含 Lorem ipsum 文本。如果我在我的 BufferedReader 下面添加以下代码,该文本将打印到控制台。 ``final JSONObject json = new JSONObject(new JSONTokener(reader.readLine()));so the malformed JSON error in my
HttpException` 不足为奇。
while ((strCurrentLine = reader.readLine()) != null) {
_logger.info("reader: " + strCurrentLine);
}
这可能是我代码中的错误吗? final JSONObject json = new JSONObject(new JSONTokener(reader.readLine()));
实际上应该是 final JSONObject json = new JSONObject(schema);
吗?如果我尝试我可以看到代码现在达到 schema.validate(json);
但有 12 schema violations found
。我看不出这些是什么。另一个想法是 body 应该是 JSON?
我将正文更新为 JSON,这导致了 2 个验证错误。一个是缺少 service_id
而 testkey
存在,所以我解决了这个问题,当我使用 final JSONObject json = new JSONObject(new JSONTokener(reader));
.
如果你只是 request = new MockHttpServletRequest();
那么请求将没有正文并且 reader 将没有数据。
您可以使用 MockMvcRequestBuilders 创建一个完整的请求。
request = MockMvcRequestBuilders.get("/message")
.contentType(MediaType.TEXT_PLAIN)
.content("{... json body ...}")
.buildRequest(context);
为了解决这个问题,我在正文 JSON 中添加了一个 notifications
键。这允许 final JSONObject json = new JSONObject(new JSONTokener(reader.readLine())); to work
.