Java Spring JPA-字节[]到字符串

Java Spring JPA-字节[]到字符串,java,Java,我有一类成就,图像是byte[] @Entity @Table(name = "ACHIEVEMENT") public class Achievement { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long achievementId; private byte[] image; 问题是用户将图像URL发送到create的端点 { "image": "https://img.favpng.co

我有一类成就,图像是byte[]

@Entity
@Table(name = "ACHIEVEMENT")
public class Achievement {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long achievementId;
private byte[] image;
问题是用户将图像URL发送到create的端点

{
    "image": "https://img.favpng.com/13/18/21/computer-icons-achievement-trophy-award-png-favpng-TYahJ0mkcwhJYqA1BPqKcSibe.jpg",
}


    public ResponseEntity<?> createAchievement(@RequestBody Achievement achievement)
{
“图像”:https://img.favpng.com/13/18/21/computer-icons-achievement-trophy-award-png-favpng-TYahJ0mkcwhJYqA1BPqKcSibe.jpg",
}
公共响应创建成就(@RequestBody成就)
Spring在读取请求主体时抛出错误,甚至不允许我将图像转换为字节数组

JSON分析错误:无法从字符串“//img.favpng.com/13/18/21/computer-icons-Achization-trophy-award-png-favpng-TYAHJ0MKCWHJYQA1BBKCSIBE.jpg”中反序列化类型为
byte[]
的值:无法将值字符串解码为base64(MIME-NO-LINEFEEDS):base64内容中的非法字符“:”(代码0x3a)


如何允许将字符串传递到端点,以便转换为字节数组?

实现这一点的最佳方法是创建“CreateAccessmentCommand”类,该类将在端点和服务逻辑之间进行DTO(顺便说一句,由于请求正文通常非常糟糕,因此等待实体对象,请阅读更多关于我们为什么使用DTO的信息)。它可以包含来自Acquisition的所有属性,但图像属性除外,该属性应为字符串(URL为字符串)


然后,您应该将CreateAccessmentCommand转换为Achization,并使用Http客户端(WebFlux或RestTemplate(从spring版本>5.0中弃用)从URL获取图像并将其保存为字节数组。

问题是,在Achization类中,您将“图像”类型定义为“字节”,但在json请求中定义为“图像”类型是字符串


您必须在成就类中将“图像”类型更改为字符串,然后对其进行解码。

您需要先下载图像。Spring不知道它应该使用给定的
字符串作为下载实际图像日期的位置。您可以创建一个简单的方法,下载图像数据,如下所示:

    public byte[] getImageDate(String url) {
        return new RestTemplate().getForEntity(url, byte[].class).getBody();
    }

查看base64编码..你想存储什么?图像URL还是实际图像数据?正如jackycflau所说,要么让前端将文件编码为base64,要么单独处理URL,即让用户提供URL并让服务器下载图像(不过要注意安全问题)。我要存储图像数据。不要在控制器中使用成就实体。。创建新模型类,以获取图像url作为字符串。然后通过获取实际图像数据将其映射到实体类。然后保存到数据库中,尽管建议将图像url存储在db中而不是实际图像中。