2015-11-06 13 views
5

मैं RepositoryRestResource से स्वत: जनरेट अंतिम बिंदुओं को कुछ अतिरिक्त व्यापार तर्क जोड़ने का प्रयास कर रहा हूँ। कृपया नीचे दिए गए कोड देखें:स्प्रिंग डाटा आराम/स्प्रिंग Hateoas कस्टम नियंत्रक - PersistentEntityResourceAssembler

संसाधन:

@RepositoryRestResource(collectionResourceRel="event", path="event") 
public interface EventRepository extends PagingAndSortingRepository<Event, Long> { 

} 

नियंत्रक:

@RepositoryRestController 
@RequestMapping(value = "/event") 
public class EventController { 

    @Autowired 
    private EventRepository eventRepository; 

    @Autowired 
    private PagedResourcesAssembler<Event> pagedResourcesAssembler; 

    @RequestMapping(method = RequestMethod.GET, value = "") 
    @ResponseBody 
    public PagedResources<PersistentEntityResource> getEvents(Pageable pageable, 
     PersistentEntityResourceAssembler persistentEntityResourceAssembler) { 

    Page<Event> events = eventRepository.findAll(pageable); 

    return pagedResourcesAssembler.toResource(events, persistentEntityResourceAssembler); 
    } 
} 

मैं निम्नलिखित दो stackoverflow लेख देखा है:

मुझे लगता है कि मैं पास हूँ, लेकिन समस्या यह है कि मैं का सामना करना पड़ रहा है जो:

return pagedResourcesAssembler.toResource(events, persistentEntityResourceAssembler); 

कह एक त्रुटि देता है:

"The method toResource(Page<Event>, Link) in the type PagedResourcesAssembler<Event> is not applicable 
for the arguments (Page<Event>, PersistentEntityResourceAssembler)". 

toResource विधि एक विधि हस्ताक्षर है एक रिसोर्सएस्सेबलर स्वीकार करता है, लेकिन मुझे यकीन नहीं है कि इसे ठीक से कैसे कार्यान्वित किया जाए और मुझे इस मामले पर कोई दस्तावेज नहीं मिल रहा है।

अग्रिम धन्यवाद, - ब्रायन

संपादित

मेरे मुद्दा मैंने सोचा था कि मैं अपने खुद के संसाधन बनाए बिना नियंत्रक तरीकों कि स्वतः निर्मित @RepositoryRestResource एनोटेशन से हैं रद्द कर सकते थे था और संसाधन असेंबलर। संसाधन और संसाधन असेंबलर बनाने के बाद मैं एंडपॉइंट पर अपना व्यावसायिक तर्क जोड़ सकता था।

संसाधन:

public class EventResource extends ResourceSupport { 
    private String name; 

    public String getName() { 
    return name; 
    } 

    public void setName(String name) { 
    this.name = name; 
    } 
} 

संसाधन असेंबलर:

@Component 
public class EventResourceAssembler extends ResourceAssemblerSupport<Event, EventResource> { 

    public EventResourceAssembler() { 
    super(EventController.class, EventResource.class); 
    } 

    @Override 
    public EventResource toResource(Event entity) { 
    EventResource eventResource = createResourceWithId(entity.getId(), entity); 
    eventResource.setName(entity.getName()); 
    return eventResource; 
    } 
} 

अपडेट किया गया नियंत्रक:

@RepositoryRestController 
@RequestMapping(value = "/event") 
public class EventController { 

    @Autowired 
    private EventRepository eventRepository; 

    @Autowired 
    private EventResourceAssembler eventResourceAssembler; 

    @Autowired 
    private PagedResourcesAssembler<Event> pageAssembler; 

    @RequestMapping(method = RequestMethod.GET, value = "") 
    @ResponseBody 
    public PagedResources<EventResource> getEvents(Pageable pageable) { 
    Page<Event> events = eventRepository.findAll(pageable); 

    // business logic 

    return pageAssembler.toResource(events, eventResourceAssembler); 
    } 
} 

बात मैं इस बारे में पसंद नहीं है कि यह उद्देश्य को हराने के लिए लगता है एक RepositoryRestResource होने के। दूसरा दृष्टिकोण इवेंट हैंडलर का उपयोग करना होगा जो पहले और/या बनाने, सहेजने, ऑपरेशन हटाने के बाद बुलाए जाएंगे।

@RepositoryEventHandler(Event.class) 
public class EventRepositoryEventHandler { 

    @HandleBeforeCreate 
    private void handleEventCreate(Event event) { 
    System.out.println("1"); 
    } 
} 

खोजने के लिए कोई घटना नहीं प्रतीत होती है या सभी ऑपरेशन ढूंढते हैं। वैसे भी, ये दोनों दृष्टिकोण RepositoryRestResource से ऑटो जनरेटेड नियंत्रक विधियों को विस्तारित करने की मेरी समस्या को हल करने लगते हैं।

+1

http://stackoverflow.com/questions/21346387/how-to-correctly-use-pagedresourcesassembler-from-spring-data कुछ और जानकारी प्रदान कर सकता है। – Jason

+0

@ जेसन धन्यवाद इस लिंक ने मुझे सही दिशा में कदम रखने में मदद की। – bmclachlin

उत्तर

1

यह एक PagedResourcesAssembler, स्प्रिंग आप के लिए एक इंजेक्षन जाएगा अगर आप से पूछना की आवश्यकता है।

public PagedResources<Foo> get(Pageable page, PagedResourcesAssembler<Foo> assembler) { 
    // ... 
} 

इस मामले में संसाधन Foo है।ऐसा लगता है कि आपके मामले में जिस संसाधन को आप वापस करने का प्रयास कर रहे हैं वह Event है।

private ResourceAssembler<Event> eventAssembler = ...; 
public PagedResources<Event> get(Pageable page, PagedResourcesAssembler<Event> pageAssembler) { 
    Event event = ...; 
    return eventAssembler.toResource(event, pageAssembler); 
} 

आप ResourceAssembler<Event> बताता है कि वसंत कैसे एक Resource में Event चालू करने के लिए प्रदान करते हैं: अगर है कि इतनी है, मैं अपने कोड की तरह कुछ देखने के लिए उम्मीद करेंगे। स्प्रिंग अंकन लिंक को संभालने के लिए PagedResourcesAssembler<Event> को आपके नियंत्रक विधि में इंजेक्ट करता है। उन्हें toResource पर कॉल करके और इंजेक्शन pageAssembler पर कॉल करके उन्हें संयोजित करें।

अंतिम परिणाम केवल उपरोक्त शरीर के रूप में वापस किया जा सकता है। आप स्टेटस कोड और हेडर पर अधिक नियंत्रण प्राप्त करने के लिए HttpEntity जैसी चीजों का भी उपयोग कर सकते हैं।

नोट: ResourceAssembler उपलब्ध कराने सचमुच इस तरह के संसाधन लपेटकर के रूप में सरल कुछ, Event के रूप में, एक Resource वस्तु के साथ हो सकता है। आम तौर पर आप हालांकि कोई प्रासंगिक लिंक जोड़ना चाहते हैं।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। मैंने सोचा कि शायद EventResource और EventResourceAssembler बनाने के बिना RepositoryRestResource एनोटेशन से ऑटो-जेनरेटेड एंडपॉइंट्स को ओवरराइड करना संभव था। लगता है कि रिपोजिटरीएवेंटहैंडलर एनोटेशन के साथ एक वर्ग का उपयोग करने के लिए सबसे अच्छा समाधान हो सकता है और उन घटनाओं का उपयोग करें जो आरईएसटी निर्यातक उत्सर्जित करता है। इस तरह मुझे अपने EventRepository को छूने की ज़रूरत नहीं है और मैं इन अंतराल पर अपना व्यावसायिक तर्क जोड़ सकता हूं। – bmclachlin

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