복붙노트

[SPRING] Spring 데이터 REST 커스텀 질의 통합

SPRING

Spring 데이터 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. ==============================

    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. ==============================

    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. ==============================

    3.나는 스프링 데이터를 사용한 적이 한번도 알지는 못했지만, 봄의 새로운 프로젝트가있다. http://projects.spring.io/spring-hateoas/ 봄의 MVC REST 서비스에서 사용하고 매우 잘 작동한다. .

    나는 스프링 데이터를 사용한 적이 한번도 알지는 못했지만, 봄의 새로운 프로젝트가있다. http://projects.spring.io/spring-hateoas/ 봄의 MVC REST 서비스에서 사용하고 매우 잘 작동한다. .

  4. from https://stackoverflow.com/questions/25980759/spring-data-rest-custom-query-integration by cc-by-sa and MIT license