[SPRING] Spring 데이터 REST 커스텀 질의 통합
SPRINGSpring 데이터 REST 커스텀 질의 통합
기본적으로 findByAllFields 쿼리가 될 Employee 엔티티에 대한 REST 링크를 만들고 싶습니다. 물론 이것은 페이지와 정렬과 결합되어야합니다. 이를 위해 다음 코드를 구현했습니다.
@Entity
public class Employee extends Persistable<Long> {
@Column
private String firstName;
@Column
private String lastName;
@Column
private String age;
@Column
@Temporal(TemporalType.TIMESTAMP)
private Date hiringDate;
}
그래서 내가 할 수있는 쿼리를 말하게하고 싶습니다.
http://localhost:8080/myApp/employees/search/all?firstName=me&lastName=self&ageFrom=20&ageTo=30&hiringDateFrom=12234433235
그래서 나는 다음과 같은 저장소를 가지고있다.
@RepositoryRestResource(collectionResourceRel="employees", path="employees")
public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Long>,
JpaSpecificationExecutor<Employee> {
}
이제는 RestController가 필요합니다.
@RepositoryRestController
public class EmployeeSearchController {
@Autowired
private EmployeeRepository employeRepository;
@RequestMapping(value = "/employees/search/all/search/all", method = RequestMethod.GET)
public Page<Employee> getEmployees(EmployeeCriteria filterCriteria, Pageable pageable) {
//EmployeeSpecification uses CriteriaAPI to form dynamic query with the fields from filterCriteria
Specification<Employee> specification = new EmployeeSpecification(filterCriteria);
return employeeRepository.findAll(specification, pageable);
}
좋습니다, 분명히이 일은 HATEOAS와 통합되지 않습니다. 이 컨트롤러를 변경하는 리소스를 어셈블 할했습니다 :
public PagedResources<Resource<Employee>> getEmployees(
PagedResourcesAssembler<Employee> assembler,
EmployeeCriteria filterCriteria, Pageable pageable) {
//EmployeeSpecification uses CriteriaAPI to form dynamic query with the fields from filterCriteria
Specification<Employee> specification = new EmployeeSpecification(filterCriteria);
Page<Employee> employees = employeeRepository.findAll(specification, pageable);
return assembler.toResource(employees);
}
분명히 그것은 작동하지 않는 이후 위의 뭔가를 놓치고있어 다음과 같은 예외가 나타납니다 :
Could not instantiate bean class [org.springframework.data.web.PagedResourcesAssembler]: No default constructor found;
Ok. 위의 리소스를 HATEOAS 아키텍처의 나머지 부분에 통합하려고합니다. 이것이 올바른 접근법인지 확실하지 않아 다른 제안도 환영합니다.
편집하다: 여기에서도 비슷한 구현을 볼 수 있습니다. 구성을 살펴보면, "사람"컨트롤러 중 하나만 제외하고 모두 작동한다는 것을 알 수 있습니다. https://github.com/cgeo7/spring-rest-example
해결법
-
==============================
1.PagedResourcesAssembler를 클래스 멤버로 autowring 해보고 아래와 같이 메소드 시그니처를 변경하십시오.
PagedResourcesAssembler를 클래스 멤버로 autowring 해보고 아래와 같이 메소드 시그니처를 변경하십시오.
@RepositoryRestController public class EmployeeSearchController { @Autowired private EmployeeRepository employeRepository; @Autowired private PagedResourcesAssembler<Employee> pagedAssembler; @RequestMapping(value = "/employees/search/all/search/all", method = RequestMethod.GET) public ResponseEntity<Resources<Resource<Employee>>> getEmployees(EmployeeCriteria filterCriteria, Pageable pageable) { //EmployeeSpecification uses CriteriaAPI to form dynamic query with the fields from filterCriteria Specification<Employee> specification = new EmployeeSpecification(filterCriteria); Page<Employee> employees = employeeRepository.findAll(specification, pageable); return assembler.toResource(employees); } }
이것은 Spring Data Rest 2.1.4.RELEASE와 완벽하게 작동합니다.
-
==============================
2.@ Stackee007에 의해 코드가 작동하지만 리소스 자체 링크가 포함되지 않습니다. 그렇게하기 위해서는 조금 더 필요합니다.
@ Stackee007에 의해 코드가 작동하지만 리소스 자체 링크가 포함되지 않습니다. 그렇게하기 위해서는 조금 더 필요합니다.
@Autowired PagedResourcesAssembler<Appointment> pagedResourcesAssembler; @RequestMapping(value = "/findTodaysSchedule") public HttpEntity<PagedResources<Resource<Appointment>>> getTodaysSchedule( PersistentEntityResourceAssembler entityAssembler, Pageable pageable) { Page<Appointment> todaysSchedule = apptRepo.findByStartTimeBetween(beginningOfDay, endOfDay, pageable); @SuppressWarnings({ "unchecked", "rawtypes" }) PagedResources<Resource<Appointment>> resource = pagedResourcesAssembler.toResource(todaysSchedule, (ResourceAssembler) entityAssembler); return new ResponseEntity<>(resource, HttpStatus.OK); }
-
==============================
3.나는 스프링 데이터를 사용한 적이 한번도 알지는 못했지만, 봄의 새로운 프로젝트가있다. http://projects.spring.io/spring-hateoas/ 봄의 MVC REST 서비스에서 사용하고 매우 잘 작동한다. .
나는 스프링 데이터를 사용한 적이 한번도 알지는 못했지만, 봄의 새로운 프로젝트가있다. http://projects.spring.io/spring-hateoas/ 봄의 MVC REST 서비스에서 사용하고 매우 잘 작동한다. .
from https://stackoverflow.com/questions/25980759/spring-data-rest-custom-query-integration by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring Data JPA로 사용자 정의 저장소를 만들려고 시도 할 때 유형 오류에 대한 속성을 찾을 수 없습니다 (0) | 2019.01.10 |
---|---|
[SPRING] Spring Data JPA Repository에서 save () 후에 반환 된 인스턴스를 사용해야하는 이유는 무엇입니까? (0) | 2019.01.10 |
[SPRING] 프로파일을 이용한 Spring 통합 테스트 (0) | 2019.01.10 |
[SPRING] Spring - 프로그래밍 방식으로 콩 세트 생성 (0) | 2019.01.10 |
[SPRING] 스프링 데이터 REST로 중첩 된 엔티티를 POST하는 방법 (0) | 2019.01.10 |