4.7.2 Repository填充

优质
小牛编辑
126浏览
2023-12-01

如果使用过Spring提供的JDBC模块,可能会对使用SQL脚本填充DataSource。Spring Data中也提供了相似的功能来填充repository,只不过不是使用SQL,而是使用XML或JSON来定义数据,

假设有一个data.json文件,内容如下:

Example 29. Data defined in JSON(使用JSON定义数据)

[ { "_class" : "com.acme.Person",
 "firstname" : "Dave",
  "lastname" : "Matthews" },
  { "_class" : "com.acme.Person",
 "firstname" : "Carter",
  "lastname" : "Beauford" } ]

为了把前面定义的数据填充到PersonRepository中可以使用repository命名空间提供的popilator元素。 Example 30. Declaring a Jackson repository populator(声明Jackson repository populator)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:repository="http://www.springframework.org/schema/data/repository"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/data/repository
    http://www.springframework.org/schema/data/repository/spring-repository.xsd">

  <repository:jackson2-populator locations="classpath:data.json" />

</beans>

上面的配置会让data.json文件可以在其他地方通过Jackson的Object Mapper读取和反序列化。

JSON object的类型可以通过解析json文件中的_class属性得到。Spring框架会根据反序列化的对象选择合适的repository来处理。

如果想要用XML来定义repositries填充的数据,需要使用unmarshaller-populator元素,可以利用Spring OXM提供的组件,想要详细了解请参考Spring参考文档:

Example 31. Declaring an unmarshalling repository populator (using JAXB)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:repository="http://www.springframework.org/schema/data/repository"
  xmlns:oxm="http://www.springframework.org/schema/oxm"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/data/repository
    http://www.springframework.org/schema/data/repository/spring-repository.xsd
    http://www.springframework.org/schema/oxm
    http://www.springframework.org/schema/oxm/spring-oxm.xsd">

  <repository:unmarshaller-populator locations="classpath:data.json"
    unmarshaller-ref="unmarshaller" />

  <oxm:jaxb2-marshaller contextPath="com.acme" />

</beans>