Я получаю java.util.MissingFormatArgumentException: ошибка спецификатора формата "% s" в java
Я получаю исключение java.lang.RuntimeException:
java.util.MissingFormatArgumentException: Format specifier '%s' error in Java below is my stacktrace:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transformToListClass': Invocation of init method failed; nested exception is java.lang.RuntimeException: java.util.MissingFormatArgumentException: Format specifier '%s'
Caused by: java.lang.RuntimeException: java.util.MissingFormatArgumentException: Format specifier '%s'
Caused by: java.util.MissingFormatArgumentException: Format specifier '%s'
Я передаю следующий файл JSON:
{
"EcrionIntegration": {
"HelloWord": "Hello World"
}
}
К следующему способу:
@PostConstruct
public ResponseEntity<InputStreamResource> tranform() {
try {
JSONParser parser = new JSONParser();
//Use JSONObject for simple JSON and JSONArray for array of JSON.
JSONObject data = (JSONObject) parser.parse(new FileReader("C:\\Liver\\code\\HELLO_WORLD.json"));//path to the JSON file.
String payLoad = data.toString();
ImageDescriptor descriptor = ecrionService.generateImage(payLoad, "HELLO_WORLD");
log.info(String.format("%s generateImage Result: [%s] ", descriptor.getFileName(), descriptor.getFileUrl()));
System.out.print(descriptor.getFileName() + " " + descriptor.getFileUrl());
String fileName = "ecrionlList.PDF";
log.info(String.format("file name:", fileName));
System.out.print("file name:" + fileName);
descriptor.setFileName(fileName);
InputStreamResource streamResource = new InputStreamResource(descriptor.getInputStream());
return ResponseEntity.ok()
.contentType(MediaType.parseMediaType(MediaType.APPLICATION_PDF_VALUE))
.body(streamResource);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
}
Что, в свою очередь, передается в следующий метод и отправляется на сервер:
public ImageDescriptor generateImage(String payLoad, String templateName) {
try {
ImageDescriptor descriptor = new ImageDescriptor();
String myEcrionUrl = "http://localhost:8013/v1/ecrion";
String ecrionURL = myEcrionUrl.concat(Constant.F_SLASH).concat(templateName);
log.info("payload" + payLoad);
ResponseEntity<Resource> responseEntity = restTemplate.exchange(
ecrionURL,
HttpMethod.POST,
ncbiService.getStringHttpEntityWithPayload(payLoad),
Resource.class);
log.info(String.format("%s generateImage Result: [%s] ", responseEntity.getBody().getInputStream()));
descriptor.setInputStream(Objects.requireNonNull(responseEntity.getBody()).getInputStream());
convert(responseEntity.getBody().getInputStream(), "sherrr.pdf");
log.info("file is:"+ convert(responseEntity.getBody().getInputStream(), "sherrr.pdf"));
return descriptor;
} catch (IOException e) {
e.printStackTrace();
log.error(" generate image failed " + e.getMessage());
throw new RuntimeException(e);
}
}
2 ответа
log.info(String.format("%s generateImage Result: [%s] ", responseEntity.getBody().getInputStream()));
В этом формате два%s, но вы передали только один аргумент.
Как видно из документации,
String.format принимает строку формата и vararg или параметры. Если вы посмотрите документацию строки форматирования, вы увидите, что после%
sign есть набор параметров, которые можно использовать для форматирования строки. Особенно для%s
написано следующее
's', 'S' general If the argument arg is null, then the result is "null". If arg implements Formattable, then arg.formatTo is invoked. Otherwise, the result is obtained by invoking arg.toString().
Таким образом, вы получали ошибку, потому что вы сообщали строке форматирования, что будут отформатированы 2 параметра, и вы передали только один из них
log.info(String.format("%s generateImage Result: [%s] ", responseEntity.getBody().getInputStream()));
Так что вы можете просто удалить первый %s
:
log.info(String.format("generateImage Result: [%s] ", responseEntity.getBody().getInputStream()));