2014-09-22 114 views
12

我想为Employee实体创建REST链接,该实体基本上是findByAllFields查询。当然这应该与PageSort相结合。为了做到这一点我已经实现了下面的代码:Spring Data 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 

所以我有以下Repository

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

好吧,以便明确问题我正在尝试将上述资源整合到HATEOAS架构的其余部分。我不完全确定这是否是正确的方法,因此欢迎任何其他建议。

编辑: 在这里你可以看到一个类似的实现。请看看配置,你会看到除“人”控制器之外的所有控制器都在工作。 https://github.com/cgeo7/spring-rest-example

+0

,如果你能为你的问题简单github上的项目,它会更容易找到您的问题......因为没有足够的信息 - 你的配置,依赖和等 – 2014-09-24 20:32:06

+0

我道歉的延迟。我创建了一个类似的小项目,反映了我拥有的所有困难https://github.com/cgeo7/spring-rest-example – ChrisGeo 2014-09-25 17:06:20

+7

@ChrisGeo和@ Stackee007,如果我问你如何定义你的EmployeeCriteria,你介意吗? '和'EmployeeSpecification'类? – BalRog 2014-10-29 18:40:56

回答

15

尝试autowring PagedResourcesAssembler为一类成员,改变方法签名类似下面

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

这由@ Stackee007工作,但与Spring数据休息2.1.4.RELEASE

+0

另请参阅http://stackoverflow.com/questions/31758862/enable-hal-serialization-in-spring-boot-for-custom-controller-method#31782016 – 2015-10-11 00:51:15

+1

汇编变量未定义!为什么? – 2015-11-11 11:40:50

6

的代码完全工作该资源将不包括self链接。为了做到这一点,需要多一点。

@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); 
} 
+0

感谢您的补充说明。这很好用! – Jon 2016-03-25 14:23:48