Spring Data Rest 和 Spring Data Envers:如何为扩展修订存储库的存储库公开 REST API

问题描述 投票:0回答:2

我在公开我的存储库的

RevisionRepository
(Spring Data Envers)端点时遇到问题,该端点扩展了
RevisionRepository
,如下所示:

    @RepositoryRestResource(path = "disciplines", itemResourceRel = "disciplines")
    public interface DisciplineRepository extends
        RevisionRepository<Discipline, Integer, Integer>,
        CrudRepository<Discipline, Integer>{

        @RestResource(path = "findByName", rel = "findByName")
        List<Discipline> findByName(String name);

    }

只暴露了

findByName
方法,有没有其他方式暴露
RevisionRepository
中的方法?我也尝试过重写
DisciplineRepository
中的这些方法,但它不起作用。

谢谢你...

java rest spring-data-rest
2个回答
6
投票

您必须编写一个自定义控制器方法来实现此功能,如下所示:

@Autowired
private DisciplineRepository disciplineRepository; 

@RequestMapping(value = "/disciplines/{id}/changes", method = RequestMethod.GET)
public ResponseEntity<Resource<RevisionsObject>> getDisciplineRevisions(@PathVariable(value = "id")Discipline discipline) {
    if (discipline != null) {
        Revisions<Integer, Discipline> disciplineRevisions = disciplineRepository.findRevisions(discipline.getId());
        return new ResponseEntity<>(new Resource<>(disciplineRevisions), HttpStatus.OK);
    } else {
        throw new ResourceNotFoundException();
    }
}

0
投票

据我所知,八年后,仍然没有其他解决方案可以不同于 adam-p 所说的那样解决此问题:您仍然需要自定义控制器。

但是,我想分享我的可重用控制器的解决方案。它必须简单地使用不同的实体/存储库进行扩展,并且开箱即用。

我愿意接受改进建议。

  • 特别是我不确定
    @RepositoryRestController
    对于
    AddressRevisionRepository
    的用法,但是
    @Controller
    @RestController
    都不起作用。
  • 我也想省略
    @RepositoryRestController
    上的路径,但我不知道如何自动添加子路径。
// Reusable no-bean repository
@NoRepositoryBean
public class RestRevisionRepository<E, Id, Rev extends Number & Comparable<Rev>, T extends RevisionRepository<E, Id, Rev>> {
    @Autowired
    T repository;

    @GetMapping(path = "/revisions/{id}", produces = "application/hal+json")
    @ResponseBody
    public Revisions<Rev, E> getRevisions(@PathVariable(value = "id") Id id) {
        if (id != null) {
            // Converter comes from dependency "jackson-datatype-hibernate6"
            return repository.findRevisions(id);
        } else {
            throw new ResourceNotFoundException();
        }
    }
}

// Repository for entity "Address"
@RepositoryRestResource
interface AddressRepository extends PagingAndSortingRepository<Address, Long>, CrudRepository<Address, Long>,
        RevisionRepository<Address, Long, Long> {
}


// Implementation of revision controller for "Address"
// Endpoint "/addresses/revision/1" returns all revisions of Person with ID 1
@RepositoryRestController("/addresses")
public class AddressRevisionRepository extends RestRevisionRepository<Address, Long, Long, AddressRepository> {
}
© www.soinside.com 2019 - 2024. All rights reserved.