2017-02-09 89 views
1

我已经尝试了许多不同的方法将JSON数组传递给Spring Data Rest Repository,但不知道如何去做。我有一个扩展库的自定义程序存储库接口:Spring Data Rest Save Iterable Entity

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

    T save(T entity) 

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

} 

我还能再救一个单独的实体,但是当我试图通过JSON对象的数组我得到一个错误,无法反序列化实例...

不知道如何传递对象,以便我可以进行批量插入。

+0

我想你需要一个标准的Spring MVC控制器在这种情况下:http://stackoverflow.com/questions/40362789/how-to-save-many-objects-in-the-same-request-using-spring-引导数据休息 –

回答

0

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

BaseRepository

@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) 

} 

ContactRepository

@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中有一个烘焙的方法,而不需要像这样推出解决方案,那么我就不想这样做。我搜索了文档和在线,但没有找到解决方案。我可能忽略了一些东西,不确定。

1

不幸的是,您不会发布使用您的接口的代码,如果您实际上按照您在问题中描述的那样传递数组,则不会调用List<T> save(Iterable<T> entities),而是调用T save(T entity)。数组不是Iterable s,因此编译器会将您的数组解释为T,并且由于数组不是实体,因此会出错。

将数组转换为Iterable来解决此问题。 Arrays.asList(someArray)有窍门。

相关问题