有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在jackson的自定义JsonSerializer中,如何正确设置视图?

我有一个UserBean,它存储一些用户字段,另一个viewer字段,指示谁正在阅读这个UserBean

在这个UserBean中,我定义了一个自定义JsonSerializer:

@JsonSerialize(using = UserBeanSerializer.class)
public class UserBean {
  @JsonIgnore
  private User viewer;

  @JsonIgnore
  Private User user;

  @JsonView(Views.Private.class)
  public String getEmail() { return user.getEmail(); }      

  // other user fields
}

在UserBeanSerializer中:

public class UserBeanSerializer extends JsonSerializer<UserBean> {

  @Override
  public void serialize(UserBean userBean, JsonGenerator jgen, SerializerProvider provider) throws IOException {

    ObjectMapper mapper = new ObjectMapper();

    Class view;
    if (Objects.equals(userBean.getViewer(), userBean.getUser()))
      view = Views.Private.class;
    else
      view = Views.Public.class;

    mapper.enable(SerializationFeature.INDENT_OUTPUT)
      .setSerializationInclusion(JsonInclude.Include.NON_NULL)
      .writerWithView(view)
      .writeValue(jgen, userBean);
  }
}

在自定义序列化程序中,我检查viewer是否等于user。如果是,则视图为私有视图,否则为公共视图

看起来还可以,但是代码writeValue将递归调用UserBeanSerializer,导致StackOverflowError。如何避免这种情况

顺便说一句,我似乎无法重用ObjectMapper或注入定义的Provider<ObjectMapper>guice(因为UserBeanSerializer是由jackson初始化的)。有没有办法克服这个问题


共 (0) 个答案