如何从声明为@RepositoryRestResource的CrudRepository拦截marshmalling(json serial / deserial)?

时间:2014-02-20 21:12:59

标签: json serialization spring-data postgis spring-data-jpa

鉴于此存储库

@RepositoryRestResource( path = "u", itemResourceRel="ui", collectionResourceRel = "us")
public interface IUserRepository extends CrudRepository<Users, Long> {
}

当我通过控制器调用我的服务方法findAllUsers()时。我转变了 实体列表结果(由免费提供的userRepository.findAll()方法返回)到域模型对象列表。这个域模型对象列表将正确反序列化为JSON,因为我正在控制如何进行反序列化。我这样做有一个具体原因,请参见下文。

现在,如果我想直接使用userRepository,我会在序列化过程中遇到循环,因为反序列化的对象来自库com.vividsolutions.jts.geom.Geometry。该类包含如下所述的方法

  Geometry getEnvelope() Returns this Geometrys bounding box.

在反序列化期间,杰克逊因为它而进入循环。我能够纠正我的控制器中的反序列化过程。我如何从CrudRepository

拦截反序列化

我遇到的第一个想法是创建我的界面的实现并覆盖所有方法,但它违背了制作样板代码的目的。

1 个答案:

答案 0 :(得分:0)

您显示@RepositoryRestResource的用法我假设您正在使用Spring Data REST导出您的存储库。对于标准的Spring MVC编组配置,请参阅reference docs

准确地说,您并没有拦截存储库。 Spring Data REST使用Jackson来编组和解组响应和请求。因此,您只需自定义SD REST将使用的Jackson ObjectMapper。为此,您需要延长RepositoryRestMvcConfiguration并覆盖configureJacksonObjectMapper(…)

class MyConfiguration extends RepositoryRestMvcConfiguration {

  protected void configureJacksonObjectMapper(ObjectMapper mapper) {
    // register custom serialializers, modules etc.
  }
}

对于一般的自定义选项,请查看杰克逊reference documentation