Jackson中JsonProperty.Access.READ_ONLY对嵌套DTO失效求助
解决Jackson嵌套DTO的READ_ONLY注解不生效问题
1. 确认注解的正确位置
你需要在AuthorDTO中定义BookDTO的属性上直接添加@JsonProperty(access = JsonProperty.Access.READ_ONLY),而非仅在BookDTO内部字段上配置。示例代码:
@Data public class AuthorDTO { private String name; @JsonProperty(access = JsonProperty.Access.READ_ONLY) private LocalDateTime creationDate; // 重点:在嵌套属性上标记只读 @JsonProperty(access = JsonProperty.Access.READ_ONLY) private BookDTO book; } @Data public class BookDTO { private String title; private String isbn; }
这样Jackson在反序列化请求体时会忽略book属性,序列化响应体时则会正常输出该字段。
2. 排除Lombok的干扰
如果使用了Lombok的@Data或@Getter/@Setter,需确保Jackson能正确识别注解:
- 给AuthorDTO添加
@JsonIgnoreProperties(ignoreUnknown = true),避免反序列化时因未知字段报错 - 若Lombok生成的setter导致Jackson仍读取嵌套属性,可手动给
book属性禁用setter:
@Data public class AuthorDTO { // ...其他属性 @JsonProperty(access = JsonProperty.Access.READ_ONLY) @Setter(AccessLevel.NONE) private BookDTO book; }
3. 修正Swagger的显示问题
Swagger默认不会自动识别Jackson的READ_ONLY注解,需配置让其在请求体中隐藏该属性:
- 若用Springfox Swagger2,添加如下配置类:
@Configuration public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("com.your.package")) .paths(PathSelectors.any()) .build() .modelMapper(new JacksonModelResolver(Json.mapper())); } }
- 若用SpringDoc OpenAPI,在
application.yml中开启Jackson模型转换器:
springdoc: model-converters: jackson: enabled: true
配置后Swagger UI就不会在请求体中展示book属性了。
4. 检查Mapstruct的映射逻辑
如果Mapstruct在将AuthorDTO映射到Author实体时处理了book属性,需在映射接口中明确忽略该字段:
@Mapper(componentModel = "spring") public interface AuthorMapper { @Mapping(target = "book", ignore = true) Author toEntity(AuthorDTO dto); AuthorDTO toDto(Author entity); }
这样即使请求体中意外传入book数据,也不会被映射到实体中。
内容的提问来源于stack exchange,提问作者jpl87
相关产品推荐
相关产品推荐

