2014-09-22 9 views
12

मैं Employee इकाई के लिए एक आरईएसटी लिंक बनाना चाहता हूं जो मूल रूप से findByAllFields क्वेरी होगी। बेशक इसे Page और Sort के साथ जोड़ा जाना चाहिए।स्प्रिंग डेटा आरईएसटी कस्टम क्वेरी एकीकरण

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

ठीक है, जाहिर है यह इसकी नौकरी करता है लेकिन यह हैटियोस के साथ एकीकृत नहीं है। मैं एक संसाधन यह करने के लिए नियंत्रक को बदलने को इकट्ठा करने का प्रयास किया:

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); 
} 
जाहिर है मैं ऊपर से कुछ याद कर रहा हूँ के बाद से यह does not काम और मैं निम्नलिखित अपवाद हो रही है

:

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

ठीक है, प्रश्न को स्पष्ट करने के लिए मैं उपर्युक्त संसाधन को हेटोएस आर्किटेक्चर के बाकी हिस्सों में एकीकृत करने की कोशिश कर रहा हूं। मुझे पूरा यकीन नहीं है कि यह सही दृष्टिकोण है इसलिए किसी अन्य सुझाव का स्वागत है।

संपादित करें: यहां आप एक समान कार्यान्वयन देख सकते हैं। कृपया कॉन्फ़िगरेशन पर एक नज़र डालें, आप देखेंगे कि सभी "व्यक्ति" नियंत्रक काम कर रहे हैं। https://github.com/cgeo7/spring-rest-example

+0

अगर आप अपनी समस्या के लिए सरल GitHub प्रोजेक्ट बना सकते हैं, यह आपकी समस्या का पता लगाने के लिए ... क्योंकि वहाँ कोई पर्याप्त जानकारी आसान होगा - अपने विन्यास, निर्भरता और आदि –

+0

मैं देरी क्षमा चाहते हैं। मैंने एक मामूली समान परियोजना बनाई है जो मेरे पास https://github.com/cgeo7/spring-rest-example – ChrisGeo

+7

@ChrisGeo और @ Stackee007 की सभी कठिनाइयों को प्रतिबिंबित करती है, क्या आप मुझसे पूछते हैं कि अगर आप अपने 'कर्मचारी न्यायालय को परिभाषित करते हैं' 'और 'कर्मचारी विनिर्देश' कक्षाएं? – BalRog

उत्तर

15

की तरह एक वर्ग के सदस्य और परिवर्तन विधि हस्ताक्षर कुछ

@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 काम करता है लेकिन द्वारा स्प्रिंग डाटा बाकी 2.1.4.RELEASE

+0

यह भी देखें http://stackoverflow.com/questions/31758862/enable-hal-serialization-in-spring-boot-for-custom-controller-method#31782016 –

+1

असेंबलर चर परिभाषित नहीं किया गया है !! क्यूं कर? –

-4

मैं वसंत डेटा का इस्तेमाल किया है कभी नहीं और मैं इसके बारे में ज्यादा जानकारी नहीं है, लेकिन जो मैं वसंत MVC बाकी सेवा में प्रयोग किया जाता है और बहुत अच्छी तरह से काम करता है है वसंत http://projects.spring.io/spring-hateoas/ से एक नई परियोजना नहीं है।

6

कोड के साथ पूरी तरह से काम करता है के रूप में PagedResourcesAssembler autowring प्रयास करें संसाधन में 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

संबंधित मुद्दे