gpt4 book ai didi

JavaFX : Retrieving Image from server, 找不到合适的构造函数

转载 作者:行者123 更新时间:2023-12-01 10:16:27 25 4
gpt4 key购买 nike

我正在开发一个 JavaFX 应用程序,我想在其中从本地主机中运行的服务器检索图像。该图像是javafx.scene.Image。但是,当我尝试检索不包含任何类的图像时,我得到没有找到合适的消息转换器,并且当我将图像放入另一个对象中时,我得到一个不同的错误。那么,如何从服务器检索图像?请告诉我。

错误日志:

org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: No suitable constructor found for type [simple type, class javafx.scene.image.Image]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)
at [Source: java.io.PushbackInputStream@1eebd84c; line: 1, column: 17] (through reference chain: Model.RestImage["canvasImage"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class javafx.scene.image.Image]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)
at [Source: java.io.PushbackInputStream@1eebd84c; line: 1, column: 17] (through reference chain: Model.RestImage["canvasImage"])
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:225)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:209)
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:95)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:835)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:819)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:599)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:557)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:475)
at Controller.AccountController$4.call(AccountController.java:140)
at Controller.AccountController$4.call(AccountController.java:127)
at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class javafx.scene.image.Image]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)
at [Source: java.io.PushbackInputStream@1eebd84c; line: 1, column: 17] (through reference chain: Model.RestImage["canvasImage"])

JavaFX 端代码:

从服务器检索图像:

  private Task<List<RestImage>> fetchCanvasImagesFromServer = new Task<List<RestImage>>() {

@Override
protected List<RestImage> call() throws Exception {
List<RestImage> imageList = new ArrayList<>();
try {
for(RestCanvas restCanvas : restCanvases) {
RestTemplate rest = StaticRestTemplate.getRest();
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add("Cookie", "JSESSIONID=" + StaticRestTemplate.jsessionid);
HttpEntity<RestImage> requestEntity = new HttpEntity<>(requestHeaders);
rest.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
rest.getMessageConverters().add(new ByteArrayHttpMessageConverter());
ResponseEntity<RestImage> responseEntity = rest.exchange(getCanvasImage+restCanvas.getMcanvasid(), HttpMethod.GET, requestEntity, RestImage.class);
imageList.add(responseEntity.getBody());
}
return imageList;
} catch (Exception e) {
e.printStackTrace();
}
return imageList;
}
};

RestImage模型:

import javafx.scene.image.Image;

public class RestImage {

private Image canvasImage;

private int someId;
// getters and setters
}

服务器端 Controller 代码:

@RequestMapping(value = "/canvasimage/{canvasid}")
public @ResponseBody
RestImage getBoardImageAsImage(@PathVariable("canvasid") int canvasid) {
System.out.println("Board image was called.");
Person person = this.personService.getCurrentlyAuthenticatedUser();
RestImage restImage = new RestImage();
restImage.setSomeId(canvasid);
BufferedImage bufferedImage = ImageIO.read(file);

restImage.setCanvasImage(SwingFXUtils.toFXImage(bufferedImage,null));

return restImage;
}

最佳答案

这种方法的根本问题是框架似乎不知道如何通过网络传递图像。简而言之,您需要找到一些可以在中间容器中轻松传输的格式。通常,对于图像传输,可以从图像中提取原始字节并发送 byte[] ,便于运输。另一端收到后,byte[]可以读回图像。一种转换方式 JavaFX Image进入byte[]首先将其转换为BufferedImage使用SwingFXUtils ,随后使用ImageIO.write()写入 ByteArrayOutputStream并获得byte[]通过toByteArray() 。最后,您可以使用ImageIO.read()ByteArrayInputStream转换byte[]进入BufferredImage然后JavaFX Image 。另外,根据您在客户端的处理方式,您可以将数据读入 JavaFX Image直接使用 this constructor .

或者,考虑到您无论如何都是从文件中读取图像,您可以将图像读入 byte[]直接与 Files.readAllBytes() 。当您跳过多个解析步骤时,这种方法会明显更快。

关于JavaFX : Retrieving Image from server, 找不到合适的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35863147/

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