【日常笔记】Spring boot:编写 Content type = ‘text/plain‘ 接口

一、项目场景:

接口:Context-Type:text/plain
方式:POST

项目场景:硬件回调接口


二、实战

@PostMapping(value = "/xx/xxx", consumes = "text/plain" )

2.1、接口

java 复制代码
    /**
     * @return String
     * @time 2024年12月4日
     */
    @PostMapping(value = "/xx/xxx", consumes = "text/plain")
    @ApiOperation(value = "物data-接入", notes = "作者:lj")
    public String djData(@RequestBody String data) throws Exception {
        data = StringUtils.replace(data,"\n","");
        DianjiangData djData = JSON.parseObject(data, DianjiangData.class);
        log.info("【物候】点将-摄像日期:{}->{}", djData.getImgDatetime(), data);
        return "OK";
    }

2.2、实体类

java 复制代码
@NoArgsConstructor
@Data
public class DianjiangData {

    @ApiModelProperty(name = "cameraID", value = "相机 ID ")
    @JsonProperty("cameraID")
    private String cameraID;

    @DateTimeFormat(pattern = "yyyyMMddHHmmss")
    @JsonFormat(pattern = "yyyyMMddHHmmss", timezone = "UTC+8")
    @ApiModelProperty(name = "imgDatetime", value = "摄像日期时间")
    @JsonProperty("imgDatetime")
    private Date imgDatetime;

    @ApiModelProperty(name = "meanNDVI", value = "归一化植被指数,范围[-1,1],保留8位小数")
    @JsonProperty("meanNDVI")
    private Double meanNDVI;

    @ApiModelProperty(name = "roiNdvi", value = "中心区域归一化植被指数,范围[-1,1],保留8位小数")
    @JsonProperty("roiNdvi")
    private Double roiNdvi;

    //注:图片上传名称规则:rgb图片名称以[***-rgb.jpg/jpeg]结尾,近红外图片名称以[***-nir.jpg/jpeg]结尾
    @ApiModelProperty(name = "name", value = "图像名称")
    @JsonProperty("name")
    private String name;

    @ApiModelProperty(name = "gcc", value = "GCC 值-物候指数,范围[-1,1],保留8位小数")
    @JsonProperty("gcc")
    private Double gcc;

    @ApiModelProperty(name = "gvi", value = "GVI 值-物候指数,范围[-1,1],保留8位小数")
    @JsonProperty("gvi")
    private Double gvi;

    @ApiModelProperty(name = "rcc", value = "相对红度指数,范围[-1,1],保留8位小数")
    @JsonProperty("rcc")
    private Double rcc;

    @ApiModelProperty(name = "bcc", value = "相对蓝度指数,范围[-1,1],保留8位小数")
    @JsonProperty("bcc")
    private Double bcc;

    @DateTimeFormat(pattern = "yyyyMMddHHmmss")
    @JsonFormat(pattern = "yyyyMMddHHmmss", timezone = "UTC+8")
    @ApiModelProperty(name = "exposure_time", value = "曝光时间")
    @JsonProperty("exposure_time")
    private Date exposureTime;

    @ApiModelProperty(name = "fileSize", value = "图像大小,单位 KB")
    @JsonProperty("fileSize")
    private Long fileSize;


}

三、常见问题:

1、springboot拦截器引起的错误:Content type 'text/plain;charset=UTF-8' not supported

1.1、原因分析

整合了springboot拦截器

java 复制代码
public class WebConfig implements WebMvcConfigurer {
/**
     * 添加自定义会覆盖默认转换器
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 将定义的时间格式转换器添加到转换器列表中,这样jackson格式化时候但凡遇到Date类型就会转换成定义的格式
        converters.add(jackson2HttpMessageConverter());
    }
    public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        ObjectMapper mapper = new ObjectMapper();
        // 包含空字段
        // mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        // 输出时间格式
        mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        // 输出Long格式为String
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        mapper.registerModule(simpleModule);
        converter.setObjectMapper(mapper);
       // converter.setSupportedMediaTypes(getSupportedMediaTypes());
        return converter;
    }
    }

1.2、解决方案:

1、简单明了的解决办法就是,不要覆盖原来的序列化器,而是继承并添加

java 复制代码
/**
     * 添加自定义消息转换器不覆盖默认转换器
     * @param converters
     */
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        System.out.println(converters.toString());
        // 将定义的时间格式转换器添加到转换器列表中,这样jackson格式化时候但凡遇到Date类型就会转换成定义的格式
        converters.add(jackson2HttpMessageConverter());
    }

2、精准定位的解决办法是:添加相应的序列化器

如添加上述的:org.springframework.http.converter.StringHttpMessageConverter@b2e4d8

java 复制代码
  /**
     * 添加自定义会覆盖默认转换器
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 将定义的时间格式转换器添加到转换器列表中,这样jackson格式化时候但凡遇到Date类型就会转换成定义的格式
        converters.add(jackson2HttpMessageConverter());
        // 添加字符串序列化器
        converters.add(new StringHttpMessageConverter());
    }

参考: springboot拦截器引起的错误

相关推荐
TeDi TIVE1 小时前
springboot和springframework版本依赖关系
java·spring boot·后端
雨辰AI1 小时前
SpringBoot3 + 人大金仓 V9 微服务监控实战|Prometheus+Grafana+SkyWalking 全链路监控
数据库·后端·微服务·grafana·prometheus·skywalking
二哈赛车手1 小时前
新人笔记---ES和kibana启动问题以及一些常用的linux的错误排查方法,以及ES,数据库泄密解决方案[超详细]
java·linux·数据库·spring boot·笔记·elasticsearch
Nicander2 小时前
理解 mybatis 源码:vibe-coding一个mini-mybatis
后端·mybatis
幸福巡礼2 小时前
【LangChain 1.2 实战(一)】 概述
笔记·学习·langchain
观无2 小时前
MAUI笔记
笔记
Hello_Embed2 小时前
Windows 安装 Claude Code 并接入 模型
windows·笔记·ai编程
小呆呆6662 小时前
Codex 穷鬼大救星
前端·人工智能·后端
大Mod_abfun2 小时前
数字媒体艺术概论(课堂作业/笔记)
笔记·媒体
笑鸿的学习笔记3 小时前
qt-C++语法笔记之Qt Graphics View 框架中的类型辨析完全指南
c++·笔记·qt