我在公开我的存储库的
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
中的这些方法,但它不起作用。
谢谢你...
您必须编写一个自定义控制器方法来实现此功能,如下所示:
@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();
}
}
据我所知,八年后,仍然没有其他解决方案可以不同于 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> {
}