【问题标题】:Spring Data Rest Save Iterable EntitySpring Data Rest Save 可迭代实体
【发布时间】:2017-06-27 17:23:52
【问题描述】:

我尝试了许多不同的方法来将 JSON 数组传递到 Spring Data Rest 存储库,但不知道该怎么做。我有一个扩展存储库的自定义存储库接口:

@NoRepositoryBean
interface BaseRepository<T, ID extends Serializable> extends Repository<T, Long> {

    T save(T entity)

    List<T> save(Iterable<T> entities)

}

我可以保存单个实体,但是当我尝试传递 JSON 对象数组时,我收到错误无法反序列化实例...

不确定如何传递对象以便我可以进行批量插入。

【问题讨论】:

标签: spring spring-data spring-data-rest


【解决方案1】:

我似乎通过覆盖保存方法来解决它,我确信有更好的方法,我愿意接受建议。

基础存储库

@NoRepositoryBean
interface BaseRepository<T, ID extends Serializable> extends Repository<T, Long> {

    @RestResource(path="byIdIn",rel="byIdIn")
    @Query("select r from #{#entityName} r where r.id in :q")
    Page<T> findByIdIn(@Param("q") List<Long> q, Pageable pageable)

    Page<T> findAll(Pageable pageable)

    T findOne(ID id)    

    T save(T entity)

    T delete(ID id)

}

联系存储库

@RepositoryRestResource(collectionResourceRel="contacts", path="contacts")
interface ContactRepository extends BaseRepository<Contact, Long>, ContactRepositoryCustom {

}

ContactRepositoryCustom

interface ContactRepositoryCustom  {
    public <S extends Contact> S save(S entity)

}

ContactRepositoryImpl

@NoRepositoryBean
class ContactRepositoryImpl implements ContactRepositoryCustom {

    @PersistenceContext
    private EntityManager em

    @Transactional
    @Override
    public <S extends Contact> S save(S entity) {
        Contact contact = entity as Contact
        try {
            em.persist(contact)
            contact.getComment().each {
                Comment comment = new Comment(contact, it)
                em.persist(comment)
            }
        } catch (Exception e) {
            println e
        }
        return contact
    }

}

这只是一个示例,需要进行一些清理,但我的 save() 方法按预期工作。如果 Spring Data / Spring Data Rest 中有一种烘焙方式可以使用注释来做这种事情,而不必推出这样的解决方案,我只是不想过度这样做。我通过文档和在线搜索,但没有找到解决方案。我可能忽略了一些东西,不确定。

【讨论】:

    【解决方案2】:

    不幸的是,您没有发布使用您的界面的代码,如果您实际上是按照问题中的描述传递了一个数组,那么您不是在调用List&lt;T&gt; save(Iterable&lt;T&gt; entities),而是在调用T save(T entity)。数组不是Iterables,因此编译器会将您的数组解释为T,并且由于数组不是实体,您会收到错误。

    将数组转换为Iterable 以解决此问题。 Arrays.asList(someArray) 成功了。

    【讨论】:

      猜你喜欢
      • 2020-03-26
      • 1970-01-01
      • 2014-10-20
      • 2019-09-30
      • 2012-10-04
      • 2018-05-28
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多