Spring 数据剩余保存可迭代实体
Spring Data Rest Save Iterable Entity
我尝试了很多不同的方法来将 JSON 的数组传递给 Spring 数据 Rest 存储库,但不确定该怎么做。我有一个扩展存储库的自定义存储库界面:
@NoRepositoryBean
interface BaseRepository<T, ID extends Serializable> extends Repository<T, Long> {
T save(T entity)
List<T> save(Iterable<T> entities)
}
我可以保存单个实体,但是当我尝试传递一个 JSON 对象数组时,出现错误无法反序列化实例...
不确定如何传递对象以便我可以进行批量插入。
不幸的是,您没有 post 使用您的接口的代码,如果您实际上是按照问题中描述的那样传递数组,则会出现错误,您不是在调用 List<T> save(Iterable<T> entities)
而是 T save(T entity)
.数组不是 Iterable
,因此编译器会将您的数组解释为 T
,并且由于数组不是实体,您会收到错误消息。
将数组转换为 Iterable
以解决此问题。 Arrays.asList(someArray)
成功了。
我似乎通过覆盖保存方法来解决这个问题,我相信有更好的方法,我愿意接受建议。
基础资料库
@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 中有一个烘焙方法,我只是不想过度使用注释来做这种事情而不必推出这样的解决方案。我通过文档和在线搜索,但没有找到解决方案。我可能忽略了一些东西,不确定。
我尝试了很多不同的方法来将 JSON 的数组传递给 Spring 数据 Rest 存储库,但不确定该怎么做。我有一个扩展存储库的自定义存储库界面:
@NoRepositoryBean
interface BaseRepository<T, ID extends Serializable> extends Repository<T, Long> {
T save(T entity)
List<T> save(Iterable<T> entities)
}
我可以保存单个实体,但是当我尝试传递一个 JSON 对象数组时,出现错误无法反序列化实例...
不确定如何传递对象以便我可以进行批量插入。
不幸的是,您没有 post 使用您的接口的代码,如果您实际上是按照问题中描述的那样传递数组,则会出现错误,您不是在调用 List<T> save(Iterable<T> entities)
而是 T save(T entity)
.数组不是 Iterable
,因此编译器会将您的数组解释为 T
,并且由于数组不是实体,您会收到错误消息。
将数组转换为 Iterable
以解决此问题。 Arrays.asList(someArray)
成功了。
我似乎通过覆盖保存方法来解决这个问题,我相信有更好的方法,我愿意接受建议。
基础资料库
@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 中有一个烘焙方法,我只是不想过度使用注释来做这种事情而不必推出这样的解决方案。我通过文档和在线搜索,但没有找到解决方案。我可能忽略了一些东西,不确定。