gpt4 book ai didi

java - JSON 对象不正确并导致 HttpException

转载 作者:行者123 更新时间:2023-12-01 18:42:26 26 4
gpt4 key购买 nike

我正在尝试测试这个方法:

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;
}

由于它是私有(private)的,我在类中创建了以下方法:

@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 信息

我的 body 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 。我看不出这些是什么。另一个想法是正文应该是 JSON 吗?

我将正文更新为 JSON,这导致了 2 个验证错误。其中之一是service_id失踪了并且 testkey存在,所以我解决了这个问题,当我使用 final JSONObject json = new JSONObject(new JSONTokener(reader)); 时,我的方法不再抛出异常。 .

最佳答案

如果您只是request = new MockHttpServletRequest();,那么请求将没有正文,并且读取器将没有数据。

您可以使用 MockMvcRequestBuilders 创建完整的请求。

request = MockMvcRequestBuilders.get("/message")
.contentType(MediaType.TEXT_PLAIN)
.content("{... json body ...}")
.buildRequest(context);

关于java - JSON 对象不正确并导致 HttpException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59899127/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com