Java后端Swagger注解、DTO类常用语法与方法问题咨询
对应问题解答
你贴的是Spring Boot项目里典型的请求数据传输对象(DTO),专门用来接收前端传入的JSON请求参数,下面逐个解答你的问题:
1. 三个import语句的作用
这三个语句都是引入第三方依赖提供的注解,具体功能:
com.fasterxml.jackson.annotation.JsonProperty:导入Jackson库的@JsonProperty注解。Jackson是Spring Boot默认内置的JSON处理工具,负责Java对象和JSON字符串之间的双向转换io.swagger.annotations.ApiModel:导入Swagger(接口文档自动生成工具)的@ApiModel注解,用来标记和接口参数/返回值相关的实体类io.swagger.annotations.ApiModelProperty:导入Swagger的@ApiModelProperty注解,用来标记实体类的字段,给字段补充接口文档说明
2. 成员变量加@JsonProperty注解的原因
这个注解的核心作用是显式指定Java字段和JSON字段的映射绑定关系:
- 后端接收前端JSON请求时,Jackson会把JSON中对应key的值赋值给标注了注解的Java字段
- 后端返回数据把Java对象转JSON时,会把字段值序列化成注解指定key对应的JSON属性
- 哪怕后续重构代码修改了Java字段名,只要注解里配置的映射名不变,就不会影响和前端的字段对接,属于兼容兜底写法。你贴的代码里注解配置的映射名和字段名一致,是显式声明的规范写法。
3. 返回值为当前类名的方法作用
你看到的taxRateId(String taxRateId)这类方法是链式设值的实现,方法最后return this就是返回当前对象实例,好处是可以连续调用方法给对象赋值,不用重复写对象名,简化代码:
// 普通set方法写法 LedgerAccountRequestDto dto = new LedgerAccountRequestDto(); dto.setName("固定资产"); dto.setNumber("1001"); dto.setTypeId("2"); dto.setTaxRateId("0.13"); // 链式写法可以简化成连续调用 LedgerAccountRequestDto dto = new LedgerAccountRequestDto() .name("固定资产") .number("1001") .typeId("2") .taxRateId("0.13");
这类方法和普通的setXxx方法共存,两种设值方式都能正常使用,很多项目会用Lombok的@Accessors(chain = true)注解自动生成这类方法,你贴的代码是手动实现的版本。
4. 类上两个注解的用途
@ApiModel(description = "transaction request"):Swagger的实体类标记注解,description是类的说明文字,生成接口文档时会显示这个类是“交易请求对应的参数实体”,前端看文档时能快速知道这个类的作用@Validated:Spring提供的参数校验开关注解,加在类上之后,Spring MVC接收前端请求时会自动校验这个类里字段配置的校验规则(比如后面的@NotNull),不符合规则就直接拦截请求返回参数错误,不用在业务代码里手写重复的判空逻辑。
5. 字段上两个注解的用途
@ApiModelProperty(required = true, value = ""):Swagger的字段说明注解,required = true会在生成的接口文档里标记这个字段为必填项,value属性本来是用来填写字段的具体含义说明,这里留空没填内容@NotNull:Java参数校验规范提供的校验注解,配合类上的@Validated生效,要求这个字段的值不能为null,如果前端传参时没传这个字段、或者传了null值,框架会自动抛出校验异常,拦截非法请求。
6. hashCode()方法的实际功能
这个方法是重写了所有Java类都继承的Object基类的hashCode()方法,作用是基于name、number、typeId、taxRateId这四个业务字段,计算当前对象的整数哈希值:
- Java的语法规范要求:如果两个对象通过
equals()方法判断为相等,那它们的hashCode返回值必须相等。你贴的代码里equals()方法也是基于这四个字段判断两个对象是否相同,所以hashCode也必须用这四个字段计算,不然把这个类的对象存到HashMap、HashSet这类基于哈希表的集合里时,会出现逻辑bug Objects.hash()是JDK 7开始提供的工具方法,会按照规范把传入的多个字段值计算成统一的哈希值,不用开发者自己手写哈希计算逻辑,减少出错概率。
补充说明:这个类里重写的equals()是按四个业务字段判断对象是否相等,toString()是为了打印日志时能直观输出对象的所有字段值,都是Java实体类的标准通用写法。
内容的提问来源于stack exchange,提问作者leo giovanni
相关产品推荐
相关产品推荐

