Java 在jackson的定制JsonSerializer中,如何正确设置视图?

Java 在jackson的定制JsonSerializer中,如何正确设置视图?,java,json,jackson,jsonserializer,Java,Json,Jackson,Jsonserializer,我有一个UserBean,它存储一些用户字段,还有一个viewer字段,指示谁在读这个UserBean 在这个UserBean中,我定义了一个自定义JsonSerializer: @JsonSerialize(using = UserBeanSerializer.class) public class UserBean { @JsonIgnore private User viewer; @JsonIgnore Private User user; @JsonView(V

我有一个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);
  }
}
在自定义序列化程序中,我检查查看器是否等于用户。如果是,则视图为私有视图,否则为公共视图

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


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

UserBean有一个UserBean类型的字段,没有@JsonIgnore?嗨。没有。UserBean没有任何类型为UserBean的字段。