字符串映射类not support type错误

博客提到接口请求数据,使用字符串转类的方法时出现not support type异常。给出的解决办法是在PackageOrderInfo类加默认值,聚焦于信息技术中数据处理时的错误解决。
定义数据类 public class PackageOrderInfo {

    private String memberId;
    private String orderId;
    private Integer packageId;
    private Date payTime;
    private Integer businessId;
}

接口请求数据:

{
    "memberId" : "1190514079467607",
    "orderId" : "1102201905251420469510000999775",
    "packageId" : 5

PackageOrderInfo packageOrderInfo = JSONObject.parseObject(input, PackageOrderInfo.class);

当用上述字符串转类的方法时报异常 not support type。

解决办法:在PackageOrderInfo类加默认值

public class PackageOrderInfo {

    private String memberId;
    private String orderId;
    private Integer packageId;
    private Date payTime = new Date();
    private Integer businessId = 0;
}
不要意思,前面的内容有些错误。 这是前端的dataFields文件,配置表单框的字段。请为我修改deviceModelTemplate的字段校验功能,使其复后端的po格式,有些字段可能没有,但不能多出一些其其他没有的字段: dataFields: // 第一种设备类型字段配置 (applicationDataType = 1) export const dataType1Fields = [ { label: '国家码', prop: 'country', show: true, required: true, placeholder: '请选国家码', type: 'select', group: 'basic', // 添加分组属性 options: [ { label: 'JP', value: 'JP' }, { label: 'EU', value: 'EU' }, { label: 'US', value: 'US' }, { label: 'ALL', value: 'ALL' } ] }, { label: '设备型号', prop: 'model', show: true, required: true, placeholder: '如:ER7206, SG2008', type: 'input', group: 'basic' }, { label: '设备版本', prop: 'modelVersion', show: true, required: true, placeholder: '如:1.0', type: 'input', group: 'basic' }, { label: '设备种类', prop: 'type', show: true, required: false, placeholder: '请选择设备种类', type: 'select', group: 'basic', options: [ { label: '网关 (gateway)', value: 'gateway' }, { label: '交换机 (switch)', value: 'switch' }, { label: 'AP (ap)', value: 'ap' }, { label: 'OLT (olt)', value: 'olt' }, { label: '其他', value: 'other' } ] }, { label: 'deviceModelTemplate', prop: 'deviceModelTemplate', show: false, required: false, placeholder: '请填写JSON字符串,例如:{"modelId": "123"}', type: 'textarea', rows: 4, group: 'deviceModelTemplate', // 保温信息分组 validator: (rule, value, callback) => { try { JSON.parse(value) callback() // 校验通过 } catch (e) { callback(new Error('收养报文必须是合法的 JSON 字符串')) } } }, { label: 'SPEC', prop: 'specification', show: false, required: false, placeholder: '请填写JSON字符串,例如:{"modelId": "123"}', type: 'textarea', rows: 4, group: 'spec' // spec信息分组 }, { label: '图片信息', prop: 'imageInfo', show: true, required: false, placeholder: '请填写JSON字符串,例如:{"modelId": "123"},', type: 'textarea', rows: 4, group: 'imageInfo' // spec信息分组 }, { label: 'web端小图', prop: 'smallImgBucketPathForWeb', urlProp: 'smallImgBucketUrlForWeb', // 添加URL字段映射 show: false, required: false, placeholder: 'web端小图', type: 'upload', rows: 4, group: 'imageInfo' }, { label: 'web端热力图', prop: 'heatmapImgBucketPathForWeb', urlProp: 'heatmapImgBucketUrlForWeb', // 添加URL字段映射 show: false, required: false, placeholder: 'web端热力图', type: 'upload', rows: 4, group: 'imageInfo' }, { label: 'web端大图', prop: 'bigImgBucketPathForWeb', urlProp: 'bigImgBucketUrlForWeb', // 添加URL字段映射 show: false, required: false, placeholder: 'web端大图', type: 'upload', rows: 4, group: 'imageInfo' }, { label: 'app端图', prop: 'hdpiImgBucketPathForApp', urlProp: 'hdpiImgBucketUrlForApp', // 添加URL字段映射 show: false, required: false, placeholder: 'app端图', type: 'upload', rows: 4, group: 'imageInfo' }, { label: 'virtualDevice', prop: 'virtualDevice', show: false, required: false, placeholder: '请填写JSON字符串,例如:{"modelId": "123"}', type: 'textarea', rows: 4, group: 'virtualDevice' // spec信息分组 }, { label: 'antennaGain', prop: 'antennaGain', show: false, required: false, placeholder: '请填写JSON字符串,例如:{"modelId": "123"}', type: 'textarea', rows: 4, group: 'antennaGain' // spec信息分组 } ] 后端po文件: /* * Copyright (c) 2024, TP-Link Corporation Limited. All rights reserved. */ package com.tplink.smb.omada.common.data.manager.dao.po; import java.util.List; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; /** * @author Zhou Zhuoran * @version 1.0 * @since 2024/12/9 */ @Builder @Getter @Setter @NoArgsConstructor @AllArgsConstructor @Document(collection = "devicemodeltemplate") public class DeviceModelTemplatePO { @Id private String id; @Field("model") private String model; @Field("hw_version") private String hwVersion; @Field("version") private String version; @Field("controller_version") private String controllerVersion; @Field("min_controller_version") private String minControllerVersion; @Field("not_support_controller_version") private List<String> notSupportControllerVersion; @Field("type") private String type; @Field("model_type") private String modelType; @Field("ippt") private Boolean ippt; @Field("model_version") private String modelVersion; @Field("adopt_resp") private String adoptResp; }
最新发布
10-15
感谢你提供了准确的后端 `DeviceModelTemplatePO` 类定义! 你的需求是: > 修改前端 `deviceModelTemplate` 字段的校验逻辑,确保用户输入的 JSON: - ✅ 可以缺少某些字段(**允许部分字段不存在**) - ❌ 但不能包含任何“不在 PO 中定义”的额外字段(**禁止多余字段**) - ✅ 必须是一个合法的 JSON 对象 --- ### ✅ 解决方案:增强 `validator` 校验逻辑 我们将基于你提供的 `DeviceModelTemplatePO` Java 类,提取所有允许的字段(注意:使用的是 MongoDB 的 `@Field("xxx")` 注解值),然后在前端进行白名单比对。 --- ### ✅ 第一步:确定后端允许的字段名(MongoDB 存储键) 从 `DeviceModelTemplatePO` 类中提取: | Java 属性 | MongoDB 字段名(@Field) | |----------|------------------------| | `model` → | `"model"` | | `hwVersion` → | `"hw_version"` | | `version` → | `"version"` | | `controllerVersion` → | `"controller_version"` | | `minControllerVersion` → | `"min_controller_version"` | | `notSupportControllerVersion` → | `"not_support_controller_version"` | | `type` → | `"type"` | | `modelType` → | `"model_type"` | | `ippt` → | `"ippt"` | | `modelVersion` → | `"model_version"` | | `adoptResp` → | `"adopt_resp"` | > ⚠️ 注意:Java 属性名 ≠ 存入数据库的字段名!我们应以 `@Field("xxx")` 为准。 所以合法字段白名单为: ```js const ALLOWED_KEYS = [ 'model', 'hw_version', 'version', 'controller_version', 'min_controller_version', 'not_support_controller_version', 'type', 'model_type', 'ippt', 'model_version', 'adopt_resp' ] ``` --- ### ✅ 第二步:修改 `dataType1Fields` 中 `deviceModelTemplate` 的 `validator` 替换原来的 `validator`,使用更严格的校验逻辑: ```js { label: 'deviceModelTemplate', prop: 'deviceModelTemplate', show: false, required: false, placeholder: '请填写JSON字符串,例如:{"model": "ER7206"}', type: 'textarea', rows: 4, group: 'deviceModelTemplate', validator: (rule, value, callback) => { // 如果为空或仅空白,且非必填,则跳过校验 if (!value || value.trim() === '') return callback() let parsed try { parsed = JSON.parse(value) } catch (e) { return callback(new Error(`JSON 解析失败: ${e.message}`)) } // 必须是一个对象(不能是数组、字符串等) if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) { return callback(new Error('deviceModelTemplate 必须是一个 JSON 对象')) } // 定义允许的字段白名单(对应 DeviceModelTemplatePO 的 @Field 值) const ALLOWED_KEYS = [ 'model', 'hw_version', 'version', 'controller_version', 'min_controller_version', 'not_support_controller_version', 'type', 'model_type', 'ippt', 'model_version', 'adopt_resp' ] // 获取用户输入的所有 key const givenKeys = Object.keys(parsed) // 找出非法字段(不在白名单中的) const invalidKeys = givenKeys.filter(key => !ALLOWED_KEYS.includes(key)) if (invalidKeys.length > 0) { return callback(new Error( `不允许的字段: ${invalidKeys.join(', ')}。\n` + `支持的字段有: ${ALLOWED_KEYS.join(', ')}` )) } // 可选:进一步检查特定字段类型(可提升体验) if (parsed.ippt !== undefined && typeof parsed.ippt !== 'boolean') { return callback(new Error('字段 "ippt" 的值必须是布尔类型(true/false)')) } if (parsed.not_support_controller_version !== undefined && !Array.isArray(parsed.not_support_controller_version)) { return callback(new Error('字段 "not_support_controller_version" 必须是字符串数组')) } // 校验通过 callback() } } ``` --- ### ✅ 示例测试 | 输入 | 是否通过 | 原因 | |------|---------|------| | `{}` | ✅ | 合法空对象 | | `{"model": "ER7206", "hw_version": "v1.0"}` | ✅ | 所有字段都在白名单内 | | `{"model": "ER7206", "unknownField": "xxx"}` | ❌ | 包含非法字段 `unknownField` | | `{"ippt": true}` | ✅ | 合法字段,布尔值正确 | | `{"ippt": "true"}` | ✅(可通过)⚠️ | 虽然类型不对,但后端接收时可能自动转换;若要严格限制,可用上面增强类型校验 | | `{"not_support_controller_version": "abc"}` | ❌(启用类型校验后) | 应为数组 | --- ### ✅ 建议优化点 #### 1. 抽取白名单为常量(便于维护和复用) ```js // 在文件顶部添加 export const DEVICE_MODEL_TEMPLATE_ALLOWED_KEYS = [ 'model', 'hw_version', 'version', 'controller_version', 'min_controller_version', 'not_support_controller_version', 'type', 'model_type', 'ippt', 'model_version', 'adopt_resp' ] ``` 然后在 `validator` 中引用它。 #### 2. 若该结构会被多处使用,建议封装成独立校验函数 ```js function validateDeviceModelTemplate(value, callback) { if (!value || !value.trim()) return callback() // ... 上述完整逻辑 } ``` --- ### ✅ 总结 你现在实现了: - ✅ 仅允许 `DeviceModelTemplatePO` 中定义的字段 - ✅ 允许缺失任意可选字段 - ✅ 禁止未知字段 - ✅ 提供清晰错误提示 - ✅ 支持基本类型校验(如 `ippt` 为布尔值) 这能有效防止前端传入错误字段导致后端反序列化失败或数据污染。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值