【日常笔记】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拦截器引起的错误

相关推荐
AINative软件工程1 分钟前
LLM 应用的分层可观测性工程实践:从 Span 到 Prompt Diff,三层 Trace 让 AI 系统真正可调试
后端·ai编程
卷无止境3 分钟前
继承与多态:Python OOP里最容易被用错的两把梯子
后端·python
明月_清风10 分钟前
📊 Tokenomics 入门:如何看懂一个项目的代币经济?
后端·web3
明月_清风16 分钟前
🏛️ DAO 治理入门:没有老板的公司怎么运转?
后端·web3
yuhaiqiang23 分钟前
上线一个人静态网站需要多少钱,难不难?
前端·后端·程序员
一只小菜鸡..11 小时前
南京大学 操作系统 (JYY) 学习笔记:进程、系统调用与状态机管理
笔记·学习
DeviceHub11 小时前
硬件工程师选型笔记:ALPS RK12L1230C0K 与 Tonevee RK12L1230C0K 电位器 PIN TO PIN 评估指南
笔记
小Ti客栈11 小时前
Spring Boot 集成 Springdoc-OpenAPI 与 Knife4j实现接口文档与可视化调试
java·spring boot·后端
whyTeaFo11 小时前
GAMES101: Lecture 13: Ray Tracing 1 (Whitted-Style Ray Tracing) ppt笔记
笔记
Ai拆代码的曹操12 小时前
Spring 事务 REQUIRES_NEW 嵌套调用:连接池翻倍的秘密
java·后端·spring