前几天在项目中使用swagger
时发现一个诡异的问题,后来发现是同时使用了@Accessors(chain = true)
和 @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
这两个注解引起的。
问题如图,password
这个字段被识别成了一个对象
一时找不出原因,于是我搭建了一个简单的项目来试错,结果发现这两个注解只要不同时使用,就没有问题,实验关键代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| @Data @Accessors(chain = true) @NoArgsConstructor public class UserA implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "username", example = "john") @Size(min = 6, max = 20, groups = { Groups.Default.class }) private String username;
@Schema(description = "password", example = "acb123", accessMode = Schema.AccessMode.WRITE_ONLY) @NotNull(groups = { Groups.Default.class }) @Size(min = 6, max = 20, groups = { Groups.Default.class }) @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String password; }
@Data
@NoArgsConstructor public class UserB implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "username", example = "john") @Size(min = 6, max = 20, groups = { Groups.Default.class }) private String username;
@Schema(description = "password", example = "acb123", accessMode = Schema.AccessMode.WRITE_ONLY) @NotNull(groups = { Groups.Default.class }) @Size(min = 6, max = 20, groups = { Groups.Default.class }) @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String password; }
|
由于使用了lombok
,所以去看了一下最后生成的代码(UserA),发现有以下代码
1 2 3 4 5 6 7 8 9 10 11 12 13
| @JsonProperty( access = Access.WRITE_ONLY ) private String password; @JsonProperty( access = Access.WRITE_ONLY ) public UserA setPassword(final String password) { this.password = password; return this; }
|
所以问题就清楚了,实际使用中发现如果使用了knife4j
的UI,password
还会被显示为嵌套对象。