0

我得到一个 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);
    }




 }
4

2 回答 2

1
log.info(String.format("%s generateImage Result: [%s] ", responseEntity.getBody().getInputStream()));

此格式有两个 %s,但您只传递了一个参数。

于 2020-08-21T04:57:07.320 回答
0

正如您在文档中看到的那样, String.format 接受格式字符串和可变参数或参数。如果您查看格式化程序字符串文档,您会看到在%签名后有一堆可用于格式化字符串的参数。特别是%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()));
于 2020-08-21T06:49:31.543 回答