首页 > 编程语言 >如何在Java项目中使用自定义序列化器处理URL

如何在Java项目中使用自定义序列化器处理URL

时间:2024-08-10 18:39:39浏览次数:6  
标签:Java String 自定义 URL img import 序列化

如何在Java项目中使用自定义序列化器处理URL

在Java开发中,处理和序列化URL是一个常见的需求,尤其是在涉及到图像资源时。如果项目需要根据特定条件处理图像URL(如添加前缀),可以自定义一个序列化器来简化这一过程。

本文将介绍如何创建一个自定义的ImgJsonSerializer类,处理单个URL和URL列表,并在序列化过程中动态添加前缀。

1. 项目背景

在许多项目中,图像资源的URL可能存储为相对路径或者完整的URL。如果你的应用程序需要统一处理这些URL,可能需要在序列化JSON时添加一个域名或路径前缀。这种处理可以在序列化时自动完成,无需在业务逻辑中重复代码。

2. 需求描述

我们需要一个自定义的JSON序列化器ImgJsonSerializer,能够处理以下两种情况:

  1. 单个URL字符串:对单个图像URL进行序列化,如果URL是相对路径,则添加一个前缀。
  2. URL字符串列表:对URL列表进行序列化,遍历列表并对每个URL进行前缀处理。

3. 自定义序列化器的实现

我们将使用Jackson库自定义序列化器。首先,确保项目中已经添加了Jackson的相关依赖。如果没有,请自行添加。

接下来,创建自定义序列化器ImgJsonSerializer

点击查看MinioProperties代码
"""
application.yml配置如下
minio:
  endpoint: http://localhost:9000  # MinIO服务器的URL
  access-key: adminminio       # 访问密钥
  secret-key: adminminio      # 密钥密码
  bucket-name: works     # 默认的Bucket名称
  secure: false          # 是否使用HTTPS(如果使用HTTPS,请设置为true)
"""
package com.echo.common.minio;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "minio")
@Data
public class MinioProperties {

    private String endpoint;

    private String accessKey;

    private String secretKey;
    
    private String bucketName;

    private String secure;
}

因为我这使用的是Minio对象存储,配置了MinioProperties类

package com.echo.common.ImgJson;

import cn.hutool.core.lang.PatternPool;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import com.echo.common.minio.MinioProperties;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.List;

@Component
public class ImgJsonSerializer extends JsonSerializer<Object> {

    @Autowired
    private MinioProperties properties;

    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        if (value == null) {
            gen.writeString(StrUtil.EMPTY);
            return;
        }

        if (value instanceof String) {
            String img = (String) value;
            if (StrUtil.isBlank(img)) {
                gen.writeString(StrUtil.EMPTY);
            } else if (ReUtil.isMatch(PatternPool.URL_HTTP, img)) {
                gen.writeString(img);
            } else {
                gen.writeString(properties.getEndpoint() + img);
            }
        } else if (value instanceof List<?> list) {
            gen.writeStartArray();
            for (Object item : list) {
                if (item instanceof String img) {
                    if (StrUtil.isBlank(img)) {
                        gen.writeString(StrUtil.EMPTY);
                    } else if (ReUtil.isMatch(PatternPool.URL_HTTP, img)) {
                        gen.writeString(img);
                    } else {
                        gen.writeString(properties.getEndpoint() + img);
                    }
                }
            }
            gen.writeEndArray();
        } else {
            throw new IllegalArgumentException("Unsupported value type: " + value.getClass().getName());
        }
    }
}

4. 如何使用自定义序列化器

在实体类中,将@JsonSerialize(using = ImgJsonSerializer.class)注解添加到需要序列化的字段上。无论是单个字符串还是字符串列表,ImgJsonSerializer将根据实际类型进行处理。

对于单个URL字段

@JsonSerialize(using = ImgJsonSerializer.class)
private String imgUrl;

对于URL列表字段

@JsonSerialize(using = ImgJsonSerializer.class)
private List<String> imgUrls;

5. 测试和验证

确保MinioProperties类配置了正确的前缀,并且在应用程序中正确注入。然后你可以创建测试数据,序列化对象,并验证输出的JSON是否符合预期。

示例测试代码

public static void main(String[] args) throws JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new SimpleModule().addSerializer(Object.class, new ImgJsonSerializer()));

    MyEntity entity = new MyEntity();
    entity.setImgUrl("image.jpg"); // 假设前缀是 http://localhost:9000/
    entity.setImgUrls(Arrays.asList("image1.jpg", "http://example.com/image2.jpg"));

    String json = mapper.writeValueAsString(entity);
    System.out.println(json);
}

6. 总结

通过创建自定义的ImgJsonSerializer,我们可以灵活地处理单个URL和URL列表,并在序列化过程中添加必要的前缀。这种方法使得处理图像URL变得更加简洁和统一,有助于保持代码的整洁性和可维护性。

标签:Java,String,自定义,URL,img,import,序列化
From: https://www.cnblogs.com/echohye/p/18352619

相关文章

  • 每周Java学习汇总
    在Java编程中,有几个重要的概念和关键字你需要理解:就近原则、this关键字、String构造方法以及字符串的比较。就近原则:在Java中,就近原则指的是当存在多个同名的变量或方法时,程序会优先使用最近定义的那个。这意味着,如果在同一个作用域内有两个同名的变量,程序会使用离它最近的那个......
  • JAVA里的xml(详解)
    1.xml1.1概述【理解】万维网联盟(W3C)万维网联盟(W3C)创建于1994年,又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。建立者:TimBerners-Lee(蒂姆·伯纳斯·李)。是Web技术领域最具权威和影响力的国际中立性技术标准机构。到目前为止,W3C已发布了200多......
  • 上千套java软件设计案例参考项目最新源码
    上千套java软件设计案例参考项目最新源码springbootssm小程序,仅供学习参考单买3元一套,299全套带走springboot+vue项目 ssm+vue项目ssm+jsp项目 Javaweb项目  小程序项目【项目可参考我发布的商品】大部分的项目都带万字设计报告文档+源码+数据库+说明文档大......
  • 安装java开发环境
    卸载JDK视频:https://www.bilibili.com/video/BV12J41137hu/?p=17&t=2m39s删除java的安装目录删除JAVA_HOME删除path下关于java的目录在cmd输入java-version,测试java是否卸载成功安装JDK网上搜索JDK8,找到下载地址同意协议下载电脑对应的版本双击安装JDK记住jdk的安......
  • Java | 图片地址查询返回参数自动拼接图片前缀地址
    代码介绍自定义的JsonSerializer来处理图片URL的拼接,增加了灵活性和可配置性。关键点:自动拼接域名:通过properties.getEndpoint()从配置文件中获取Minio接口域名,然后根据条件决定是否拼接域名。处理多个图片URL:代码处理了可能包含多个图片URL的情况(以逗号分隔),并且确保了每个UR......
  • Java每日一练06
    这里写目录标题一级目录二级目录三级目录题目1.一般情况下,以下哪个选项不是关系数据模型与对象模型之间匹配关系?2.transient变量和下面哪一项有关?3.线程安全的map在JDK1.5及其更高版本环境有哪几种方法可以实现?4.使用mvc模式设计的web应用程序具有以下优点,除了?5.......
  • Java中字符串的常量池
    计算机存储中存在一个堆区域,堆区域中存在一个常量池,当申请了字符串变量后,会将值放入常量池中,下次申请新的变量时,会优先从常量池中查找,如果常量池中已经存在,则变量会直接指向常量池中的值,从而节省空间(jdk1.8之后的字符串常量池存在于堆中) Stringx1="aaa";//在常量池......
  • java实现解析pdf格式发票
    为了减少用户工作量及误操作的可能性,需要实现用户上传PDF格式的发票,系统通过解析PDF文件获取发票内容,并直接将其写入表单。以下文章记录了功能实现的代码。发票样式发票内容解析引用Maven使用pdfbox<dependency><groupId>org.apache.pdfbox</groupId><artif......
  • Java知识点1
    Java知识点什么是字节码?采用字节码的好处是什么?在Java中,JVM可以理解的代码就叫做字节码(即扩展名为.class的文件),它只面向虚拟机。Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。字节码并不针对一种特定......
  • java导出pdf
    文章目录概要maven包进入工具类使用示例注意事项概要java利用itextpdf导出pdfmaven包进入 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13.3</version> </dependency> ......