You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:35:18