Spring Data Rest Save 可迭代实体
Posted
技术标签:
【中文标题】Spring Data Rest Save 可迭代实体【英文标题】:Spring Data Rest Save Iterable Entity 【发布时间】: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 MVC 控制器:***.com/questions/40362789/… 【参考方案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<T> save(Iterable<T> entities)
,而是在调用T save(T entity)
。数组不是Iterable
s,因此编译器会将您的数组解释为T
,并且由于数组不是实体,您会收到错误。
将数组转换为Iterable
以解决此问题。 Arrays.asList(someArray)
成功了。
【讨论】:
以上是关于Spring Data Rest Save 可迭代实体的主要内容,如果未能解决你的问题,请参考以下文章
使用 REST 代理访问 Ext.data.Model.save() 回调中的 HTTP 响应
在 Spring Data rest json Response 中动态过滤实体字段