如何控制外部/打包对象属性的JsonView可见性?

时间:2016-02-13 16:22:37

标签: java ajax jackson

我的数据对象包括我在项目中使用的库中的混合原语和数据对象。我知道我可以通过利用@JsonView注释来控制在Ajax调用中返回到浏览器的数据,但是这对于库中定义的数据对象不起作用 - 因为这些库中的数据对象定义中没有注释字段。下面的示例,其中LatLng来自我正在使用的geospatial library。我该如何解决这个问题?我希望LatLng的纬度和经度可以包含在Ajax响应中。

import com.javadocmd.simplelatlng.LatLng;

public class Waypoint
{
  @JsonView(Views.Public.class)
  private int number;

  private int previousNumber;

  @JsonView(Views.Public.class)
  private LatLng latLon;
}

更新1

我尝试简单地包装第三方对象,该对象有效:

public class LatLng extends com.javadocmd.simplelatlng.LatLng implements Serializable
{
  private static final long serialVersionUID = -5859289528464880247L;

  @JsonView(Views.Public.class)
  private long latitude;

  @JsonView(Views.Public.class)
  private long longitude;

  public LatLng(double latitude, double longitude)
  {
    super(latitude, longitude);
  }
}

更新2

作为suggested by Jan Chimiak,MixIns是更好的方式。无需更新对新包装类的所有对象引用...我将以下内容添加到我的MVC

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters)
{
    ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().mixIn(LatLng.class, LatLngMixIn.class).build();
    converters.add(new MappingJackson2HttpMessageConverter(objectMapper));
    super.configureMessageConverters(converters);
}

并定义我的MixIn如下:

public abstract class LatLngMixIn
{
    @JsonView(Views.Public.class)
    private long latitude;

    @JsonView(Views.Public.class)
    private long longitude;
}

1 个答案:

答案 0 :(得分:1)

使用mixins。见http://wiki.fasterxml.com/JacksonMixInAnnotations

这样,无论第三方库中定义了什么,您都可以在 类中定义注释。