Spring Boot中@JsonIgnore忽略字段后如何给指定接口单独暴露jwt?
解决方案
方案1:使用Jackson @JsonView 注解(推荐,规范易维护)
步骤1:定义视图标识类
// 视图类可单独存放,也可作为静态内部类放在实体类中 public class JwtView { // 普通视图:默认返回除jwt外的所有字段 public interface Normal {} // 扩展视图:继承普通视图,额外返回jwt字段 public interface WithJwt extends Normal {} }
步骤2:修改实体类注解
删除jwt字段上的@JsonIgnore,给所有字段关联对应的视图:
public class MyJwt { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @JsonView(JwtView.Normal.class) private Long id; @Lob @JsonView(JwtView.WithJwt.class) private String jwt; @JsonView(JwtView.Normal.class) private String reminderKey; @JsonView(JwtView.Normal.class) private String userAccountId; @JsonView(JwtView.Normal.class) private String clientKey; @JsonView(JwtView.Normal.class) private Timestamp createdDate; @JsonView(JwtView.Normal.class) private Timestamp expirationDate; @JsonView(JwtView.Normal.class) private byte statusCode; }
步骤3:给接口关联对应视图
- 普通接口(不需要返回jwt)加
@JsonView(JwtView.Normal.class)注解
@GetMapping("/common/list") @JsonView(JwtView.Normal.class) public List<MyJwt> getCommonList() { // 业务逻辑 }
- 需要返回jwt的指定接口加
@JsonView(JwtView.WithJwt.class)注解
@GetMapping("/special/jwt") @JsonView(JwtView.WithJwt.class) public MyJwt getJwtInfo() { // 业务逻辑 }
方案2:动态过滤字段(无需修改实体类,适合临时场景)
如果不想改动原有实体类的注解,可在需要返回jwt的接口中通过MappingJacksonValue动态调整序列化规则:
@GetMapping("/special/jwt") public MappingJacksonValue getJwtInfo() { // 查询到实体数据 MyJwt data = myJwtService.getById(1L); MappingJacksonValue result = new MappingJacksonValue(data); ObjectMapper mapper = new ObjectMapper(); // 单独配置MyJwt类的jwt字段可见,不影响其他注解的生效 mapper.configOverride(MyJwt.class) .setAttributeVisibility(JsonAutoDetect.Value.defaultVisibility() .withFieldVisibility(JsonAutoDetect.Visibility.ANY)); result.setObjectMapper(mapper); return result; }
注意该方案仅在当前接口生效,不会影响其他接口的序列化逻辑。
内容的提问来源于stack exchange,提问作者Mesut Can
相关产品推荐
相关产品推荐

