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

标签 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;
}

最佳答案

使用混入。请参阅https://github.com/FasterXML/jackson-docs/wiki/JacksonMixInAnnotations

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

关于java - 如何控制 JsonView 外部/打包对象属性的可见性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35382263/

相关文章:

java - 无法执行插入/更新/删除

javascript - 更改字段时提交 AJAX 表单

java - Jackson:反序列化时保留对映射值中键的引用

java - 如何使用 spring security 为特定端点添加 HTTP 基本身份验证?

java - 在 Android 和 PC 之间创建 Wifi 点对点连接

javascript - 非常简单的 Ajax 问题

php - 对 php 文件的 Ajax 调用不适用于该文件中的 'require_once'

使用 mixin 和更改的 getter 进行 JAVA 对象映射器序列化

java - 如果字段不存在, jackson 反序列化失败

javax.ws.rs.ProcessingException : RESTEASY004655: Unable to invoke request