2014-09-22 8 views
12

Ich möchte einen REST-Link für eine Employee Einheit erstellen, die im Grunde eine findByAllFields Abfrage sein wird. Natürlich sollte dies mit Page und Sort kombiniert werden. Um das zu tun, dass ich den folgenden Code implementiert haben:Spring Data REST benutzerdefinierte Abfrage Integration

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

So würde ich können eine Abfrage haben möchte sagen, wo ich tun kann:

http://localhost:8080/myApp/employees/search/all?firstName=me&lastName=self&ageFrom=20&ageTo=30&hiringDateFrom=12234433235 

So habe ich die folgende Repository

@RepositoryRestResource(collectionResourceRel="employees", path="employees") 
public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Long>, 
                 JpaSpecificationExecutor<Employee> { 

} 

Ok, so jetzt brauche ich eine 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); 
} 

Ok, offensichtlich tut dies seine Arbeit, aber ist nicht mit HATEOAS integriert.

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

Offensichtlich etwas von oben fehlt mir da es nicht funktioniert und ich erhalte die folgende Ausnahme:: Ich habe eine Ressource Ändern der Controller dazu zu montieren versucht

Could not instantiate bean class [org.springframework.data.web.PagedResourcesAssembler]: No default constructor found; 

Ok, um die Frage klar zu machen Ich versuche, die obige Ressource in den Rest der HATEOAS-Architektur zu integrieren. Ich bin mir nicht ganz sicher, ob dies der richtige Ansatz ist, daher sind alle anderen Vorschläge willkommen.

EDIT: Hier können Sie eine ähnliche Implementierung sehen. Bitte schauen Sie sich die Konfiguration an, Sie werden sehen, dass alle außer einem der "Person" Controller arbeiten. https://github.com/cgeo7/spring-rest-example

+0

wenn Sie einfaches Github-Projekt für das Problem zu schaffen, wäre es einfacher, Ihr Problem zu finden ... weil es keine genügenden Informationen ist - Ihre Konfigurationen, Abhängigkeiten und etc –

+0

ich die Verzögerung entschuldigen. Ich habe ein kleines ähnliches Projekt erstellt, das alle Schwierigkeiten widerspiegelt, die ich habe https://github.com/cgeo7/spring-rest-example – ChrisGeo

+7

@ChrisGeo und @ Stackee007, stört es Sie schrecklich, wenn ich Sie frage, wie Sie Ihre 'EmployeeCriteria definieren 'und' EmployeeSpecification' Klassen? – BalRog

Antwort

15

Versuchen PagedResourcesAssembler als Klasse Mitglied und Änderungsverfahren Signatur etwas wie unten

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

Diese perfekt mit Spring Data Erholung 2.1.4.RELEASE autowring von

+0

Siehe auch http://stackoverflow.com/questions/31758862/enable-hal-serialization-in-spring-boot-for-custom-controller-method#31782016 –

+1

Assembler-Variable ist nicht definiert! Warum? –

-4

Ich habe nie Frühling Daten verwendet, und ich bin nicht viel bekannt, aber es ist ein neues Projekt von Frühling http://projects.spring.io/spring-hateoas/, die ich im Frühjahr MVC REST-Service verwendet habe und sehr gut funktioniert.

6

Der Code funktioniert @ Stackee007 funktioniert, aber Die Ressource enthält keine self Links. Um dies zu tun, ist ein wenig mehr erforderlich.

@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

Danke für die zusätzliche Klarstellung. Das funktioniert gut! – Jon