jackson @JsonIgnoreProperties与@JsonIgnore基本使用

问题由来:
springboot项目中定义了很多类,我们在rest返回中直接返回或者在返回对象中使用这些类,spring已经使用jackson自动帮我们完成这些的to json。但是有时候自动转的json内容太多,或者格式不符合我们的期望,因此需要调整类的to json过程,或者说希望自定义类的json过程。

解决办法:
使用@JsonIgnoreProperties、@JsonIgnore、@JsonFormat。

@JsonIgnore注解用来忽略某些字段,可以用在变量或者Getter方法上,用在Setter方法时,和变量效果一样。这个注解一般用在我们要忽略的字段上。

@JsonIgnoreProperties(ignoreUnknown = true),将这个注解写在类上之后,就会忽略类中不存在的字段。这个注解还可以指定要忽略的字段,例如@JsonIgnoreProperties({ “password”, “secretKey” })

@JsonFormat可以帮我们完成格式转换。例如对于Date类型字段,如果不适用JsonFormat默认在rest返回的是long,如果我们使用@JsonFormat(timezone = “GMT+8”, pattern = “yyyy-MM-dd HH:mm:ss”),就返回"2018-11-16 22:58:15"

具体可以参考官方文档
https://fasterxml.github.io/jackson-annotations/javadoc/2.6/com/fasterxml/jackson/annotation/JsonIgnoreProperties.html

实际代码
代码简要说明, User类的fullName 和comment字段会被@JsonIgnoreProperties注解忽略。address字段会被@JsonIgnore注解忽略。regDate会按照@JsonFormat(timezone = “GMT+8”, pattern = “yyyy-MM-dd HH:mm:ss”)进行格式转。

@Data
@JsonIgnoreProperties(value = {"fullName", "comment"})
public class User {
    private String id;
    private String name;
    private String fullName;
    private String comment;
    private String mail;

    @JsonIgnore
    private String address;

    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private Date regDate;

    private Date reg2Date;
}
<think>嗯,用户的问题是关于Java注解的正确使用,具体涉及@Schema、@ExcelProperty、@NotEmpty和@JsonIgnore。我需要先逐一分析每个注解的用途、常见用法以及可能遇到的问题。 首先,@Schema注解通常属于Swagger或OpenAPI相关库,用于生成API文档。需要说明它的作用,比如描述字段的信息,以及示例值和是否必填。可能用户在使用时没有正确设置导致文档生成不符合预期,这时候要提醒注意版本兼容性和属性设置。 接下来是@ExcelProperty,这应该是EasyExcel的注解,用于Excel文件的读写。需要解释如何指定列名和顺序,可能用户遇到列顺序混乱或数据转换问题,要提到索引和转换器的使用。还有日期格式的处理,避免格式错误。 然后是@NotEmpty,属于Hibernate Validator,用于验证字段非空。需要区分@NotEmpty、@NotNull和@NotBlank的不同,用户可能混淆了它们的用途,导致验证不生效。要强调在DTO中使用,并配合@Valid注解触发校验。 最后是@JsonIgnore,来自Jackson库,用于JSON序列化时忽略字段。常见问题是前端仍然看到敏感字段,可能需要配合其他注解如@JsonProperty一起使用,或者动态忽略的情况需要用@JsonView。还要注意lombok的@Getter一起使用时的冲突。 用户的问题可能涉及如何正确配置这些注解,或者解决配置后功能未生效的情况。比如@ExcelProperty的索引顺序错误导致数据错位,或者@JsonIgnore没有生效导致敏感信息泄露。需要给出具体的代码示例和常见问题解决方案。 此外,用户提到的参考引用是关于@TableField,属于MyBatis-Plus,虽然不在问题中,但可能需要确保回答中的注解用户实际使用的库版本兼容,避免因版本差异导致配置错误。例如,不同版本的Swagger可能对@Schema的支持不同。 最后,生成的相关问题需要覆盖每个注解的常见疑问,比如校验不生效、Excel导入导出问题、文档生成和字段忽略的技巧,帮助用户进一步排查可能遇到的问题。</think>### Java注解Schema、ExcelProperty、NotEmpty和JsonIgnore用法解析 #### 一、@Schema注解(OpenAPI/Swagger) 用于生成API文档时定义字段的元数据信息,需配合`springdoc-openapi`使用: ```java @Schema( name = "userInfo", description = "用户信息模型", requiredMode = Schema.RequiredMode.REQUIRED ) public class UserDTO { @Schema(description = "用户名", example = "张三", minLength = 3) private String username; @Schema(description = "年龄", minimum = "0", maximum = "150") private Integer age; } ``` **常见问题解决**: 1. 文档字段未显示:检查是否添加`@io.swagger.v3.oas.annotations.media.Schema`全路径 2. 必填标记失效:显式设置`requiredMode = REQUIRED`而非`required = true`(v1.6+) #### 二、@ExcelProperty(EasyExcel) 用于Excel文件读写时的列映射,支持复杂表头处理: ```java public class Employee { @ExcelProperty(value = {"主表头", "姓名"}, index = 0) private String name; @ExcelProperty(value = "入职日期", index = 1) @DateTimeFormat("yyyy-MM-dd") private Date hireDate; @ExcelProperty(converter = GenderConverter.class, index = 2) private Integer gender; //0-女,1-男 } ``` **典型问题处理**: - 数据错位:必须保证`index`值连续且唯一 - 日期格式异常:需同时添加`@DateTimeFormat` - 自定义类型转换:实现`Converter<T>`接口[^1] #### 三、@NotEmpty(Hibernate Validator) 字段校验注解,需配合`@Valid`使用: ```java @PostMapping("/create") public Result createUser(@Valid @RequestBody UserDTO user) { //... } public class UserDTO { @NotEmpty(message = "账号不能为空") private String account; @NotBlank(message = "密码需包含非空字符") private String password; @NotNull(message = "部门必须指定") private Department dept; } ``` **校验规则对比**: | 注解 | 适用类型 | 空值定义 | |------------|--------------|---------------------| | @NotNull | 任意类型 | 对象引用为null | | @NotEmpty | String/Collection | 空字符串/空集合 | | @NotBlank | String | 仅空白字符组成的字符串 | #### 四、@JsonIgnoreJackson) JSON序列化控制,支持多场景字段忽略: ```java public class Order { @JsonIgnore private String internalCode; //完全忽略 @JsonIgnore @JsonProperty(access = Access.WRITE_ONLY) private String creditCardNo; //仅反序列化时接收 @JsonView(Views.Public.class) private String sensitiveInfo; //按视图控制显示 } ``` **进阶用法**: 1. 条件忽略:使用`@JsonInclude(Include.NON_NULL)` 2. 组合注解:`@Data` + `@JsonIgnoreProperties(ignoreUnknown = true)` 3. 动态过滤:`ObjectMapper.addMixIn()`
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值