问题出现(对比示例)
资产类型表数据类型
对应接受的实体类
package com.njry.modules.system.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.njry.base.BaseEntity;
import lombok.Data;
import cn.hutool.core.bean.BeanUtil;
import io.swagger.annotations.ApiModelProperty;
import cn.hutool.core.bean.copier.CopyOptions;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* @description /
* @author WJ
* @date 2024-04-19
**/
@Data
@TableName("T_ATOM_BUSI_CATEGORY")
public class TAtomBusiCategory extends BaseEntity implements Serializable {
@NotNull(groups = BaseEntity.Update.class)
@TableId(value="category_id", type = IdType.INPUT)
@ApiModelProperty(value = "ID", hidden = true)
private Long id;
@ApiModelProperty(value = "业务类别ID")
private Long categoryId;
@NotEmpty(message = "业务类别名称不能为空")
@Length(min = 1 , max = 40 , message = "名字字节长度1~40")
@ApiModelProperty(value = "业务类别名称")
private String categoryName;
@ApiModelProperty(value = "上级ID")
private Long superiorId;
@ApiModelProperty(value = "层级")
private Integer categoryLev;
@ApiModelProperty(value = "排序")
private Integer orderBy;
@TableField(exist = false)
private List<TAtomBusiCategory> children;
@ApiModelProperty(value = "子业务分类数目", hidden = true)
private Integer subCount = 0;
@ApiModelProperty(value = "创建人ID")
private String createId;
@ApiModelProperty(value = "创建时间")
private Date createDate;
@Length(min = 1 , max = 10 , message = "业务类别英文名称长度1~10")
@ApiModelProperty(value = "业务类别英文名称")
private String categoryNameEn;
public void copy(TAtomBusiCategory source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
public Boolean getHasChildren() {
return subCount > 0;
}
public Boolean getLeaf() {
return subCount <= 0;
}
public String getLabel() {
return categoryName;
}
}
前段入参是字符串类型
实体类接受自动转成null(这里看总结)
看看最终执行的sql
上面是类型不一致可以正确插入,下面看看类型一直导致插入错误
任务管理表数据类型
对应接受的实体类
package com.njry.modules.system.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.njry.base.WorkTypeBaseEntity;
import lombok.Data;
import cn.hutool.core.bean.BeanUtil;
import io.swagger.annotations.ApiModelProperty;
import cn.hutool.core.bean.copier.CopyOptions;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @description /
* @author wj
* @date 2024-04-25
**/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("NJRY_TASK_INFO")
public class NjryTaskInfo extends WorkTypeBaseEntity implements Serializable {
@NotNull(groups = WorkTypeBaseEntity.Update.class)
@TableId(value="task_id", type = IdType.INPUT)
@ApiModelProperty(value = "ID", hidden = true)
private Long id;
@ApiModelProperty(value = "任务编号")
private String taskId;
@NotBlank
@ApiModelProperty(value = "任务名称")
private String taskName;
@NotNull
@ApiModelProperty(value = "任务类型 1:日 2:月 3:实时")
private Integer taskType;
@NotBlank
@ApiModelProperty(value = "存储过程名称")
private String procName;
@NotNull
@ApiModelProperty(value = "开始检测时间")
private Integer startTime;
@ApiModelProperty(value = "是否有效")
private Integer isValid;
@ApiModelProperty(value = "手机号码")
private String cellphone;
@NotNull
@ApiModelProperty(value = "结束日期")
private Date endDate;
@NotNull
@ApiModelProperty(value = "开始日期")
private Date startDate;
@ApiModelProperty(value = "是否发送成功短信")
private Integer isSucMes;
public void copy(NjryTaskInfo source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
}
}
前端入参
这里实体类接受没有自动转成null
最终报错
解决办法(insert把前端的空字符串变成null)
在control层直接改变
@PostMapping
@Log("新增任务管理")
@ApiOperation("新增任务管理")
@PreAuthorize("@el.check('njryTaskInfo:add')")
public ResponseEntity<Object> createNjryTaskInfo(@Validated @RequestBody NjryTaskInfo resources){
if (resources.getId() != null) {
throw new BadRequestException("A new "+ ENTITY_NAME +" cannot already have an ID");
}
// 原来的id 都是NUMBER类型,前段默认传孔字符串,类型不一致会转成null
// 但是njry_task_info这个表的id 用VARCHAR2(32)
if(resources.getTaskId().equals("")){
resources.setTaskId(null);
}
njryTaskInfoService.create(resources);
return new ResponseEntity<>(HttpStatus.CREATED);
}
总结
不知道springboot每次注解在哪执行long和string相互转换的
gtp给的答案:
在 Spring Boot 中,当你使用 @RequestBody
注解将请求体中的 JSON 数据绑定到实体类时,会根据实体类中字段的类型来进行转换。在默认情况下,Spring Boot 会尽可能地进行类型转换,并尝试将请求体中的空字符串转换为对应字段的类型。但是,有时候这种转换的行为会受到一些配置或注解的影响,导致一些字段的值转换为 null
。
以下是可能导致某些字段值为 null
的一些常见原因:
-
数据绑定失败: 如果请求体中的 JSON 数据与实体类的字段类型不匹配,或者无法进行正确的转换,Spring Boot 可能会将这些字段的值设置为
null
。这可能是因为 JSON 数据中的空字符串无法正确转换为实体类中的某些类型,比如Integer
、Long
等。 -
注解影响: 在实体类中使用了一些注解,比如
@JsonDeserialize
、@JsonFormat
等,它们可能会影响请求体到实体类字段的转换行为。特别是一些日期时间格式的注解,可能会导致空字符串无法正确转换为日期时间类型,从而被转换为null
。 -
全局配置: Spring Boot 有一些全局配置项,比如
spring.mvc.convert.empty-string-as-null=true
,它可以影响空字符串的转换行为。如果该配置项设置为true
,则空字符串可能会被转换为null
。