【问题标题】:How to use repository populator with spring data -jpa?如何将存储库填充器与 spring data -jpa 一起使用?
【发布时间】:2012-11-26 13:05:26
【问题描述】:

我正在使用 Spring Data JPA,并且我正在尝试使用存储库填充器来填充数据 - 但我遇到了格式错误的 json 异常。

我认为它可能是 data.json 文件的位置。我已将其放在 META-INF 文件夹中,并正在为测试用例进行如下配置

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:META-INF/integration-test-context.xml","classpath:META-INF/sample-data.xml"})
public class JpaCompanyRepositoryIntegrationTest{

//Test cases here 

}

我的 sample-data.xml 是:

<?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:jackson-populator location="classpath:data.json" />

</beans>

data.json 包含

[{"_class" : "com.some.Class",
    "id" : "id1",
    "firstname" : "Admin",
    "lastname" : "admin"
},
{ 
    "_class" : "com.some.Class",
    "id" : "id2",
    "firstname" : "user",
    "lastname" : "user"
}]

我得到以下异常:

Caused by: java.lang.RuntimeException: org.codehaus.jackson.JsonParseException: Unexpected character ('c' (code 99)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
 at [Source: java.io.ByteArrayInputStream@61adabf3; line: 1, column: 2]
    at org.springframework.data.repository.init.ResourceReaderRepositoryPopulator.readObjectFrom(ResourceReaderRepositoryPopulator.java:145)
    at org.springframework.data.repository.init.ResourceReaderRepositoryPopulator.populate(ResourceReaderRepositoryPopulator.java:115)
    at org.springframework.data.repository.init.AbstractRepositoryPopulatorFactoryBean.onApplicationEvent(AbstractRepositoryPopulatorFactoryBean.java:93)
    at org.springframework.data.repository.init.AbstractRepositoryPopulatorFactoryBean.onApplicationEvent(AbstractRepositoryPopulatorFactoryBean.java:34)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:97)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:324)
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:934)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:472)
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:103)
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:1)
    at org.springframework.test.context.support.DelegatingSmartContextLoader.loadContext(DelegatingSmartContextLoader.java:228)
    at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:124)
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:148)
    ... 24 more
Caused by: org.codehaus.jackson.JsonParseException: Unexpected character ('c' (code 99)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
 at [Source: java.io.ByteArrayInputStream@61adabf3; line: 1, column: 2]
    at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1432)
    at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:385)
    at org.codehaus.jackson.impl.JsonParserMinimalBase._reportUnexpectedChar(JsonParserMinimalBase.java:306)
    at org.codehaus.jackson.impl.Utf8StreamParser._handleUnexpectedValue(Utf8StreamParser.java:2084)
    at org.codehaus.jackson.impl.Utf8StreamParser._nextTokenNotInObject(Utf8StreamParser.java:600)
    at org.codehaus.jackson.impl.Utf8StreamParser.nextToken(Utf8StreamParser.java:486)
    at org.codehaus.jackson.map.ObjectReader._initForReading(ObjectReader.java:638)
    at org.codehaus.jackson.map.ObjectReader._bindAsTree(ObjectReader.java:597)
    at org.codehaus.jackson.map.ObjectReader._bindAndCloseAsTree(ObjectReader.java:621)
    at org.codehaus.jackson.map.ObjectReader.readTree(ObjectReader.java:381)
    at org.springframework.data.repository.init.JacksonResourceReader.readFrom(JacksonResourceReader.java:80)
    at org.springframework.data.repository.init.ResourceReaderRepositoryPopulator.readObjectFrom(ResourceReaderRepositoryPopulator.java:143)
    ... 36 more

所以我做了更多的调试,结果发现配置正在存储库填充器定义中寻找“位置”属性 - 而 xml 需要“位置”属性。我正在使用弹簧数据 1.4.0.RELEASE 和杰克逊 1.9.2。我是否混淆了依赖项?

【问题讨论】:

  • 我正在 StackOverflow 上监控 Spring Data 相关问题,因此无需通过电子邮件联系我 :)。

标签: java spring-data spring-data-jpa


【解决方案1】:

这是当前版本的 Spring Data Commons 中的一个错误(有关详细信息,请参阅DATACMNS-227)。它是蜜蜂 fixed recently,但由于修复需要更改命名空间,它只会使其成为 Spring Data Commons 1.5 即将到来的里程碑。

【讨论】:

  • 谢谢,有发布日期吗?
  • 否,但您可以直接使用FactoryBeans,同时使用beans 命名空间进行设置。
【解决方案2】:

我认为您不能将_ 直接用作 JSON 密钥 (_class)。

查看List of extensions for non-standard JSON

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 2019-03-22
    • 2014-10-21
    • 1970-01-01
    • 2017-08-26
    相关资源
    最近更新 更多