2015-03-31 8 views
13

डेटा रिपोजिटरी विधि को सीधे कॉल करते समय projection निर्दिष्ट करना संभव है? यहाँ भंडार कोड है - ध्यान दें मैं बाकी के माध्यम से इसे बेनकाब करने के लिए नहीं करना चाहते हैं, तो इसके बजाय मैं एक सेवा या नियंत्रक से यह कॉल करने के लिए सक्षम होने के लिए करना चाहते हैं:स्प्रिंग एमवीसी नियंत्रकों में स्प्रिंग डेटा अनुमानों को कैसे लागू करें?

@PreAuthorize(value = "hasRole('ROLE_ADMIN')") 
@RequestMapping(value = "https://stackoverflow.com/users/employee") 
public Page<User> listEmployees(Pageable pageable) { 
    return usersRepository.findEmployeeUsers(pageable); 
} 
: एक नियंत्रक मैं यह करने में तो

@RepositoryRestResource(exported = false) 
public interface UsersRepository extends PagingAndSortingRepository<User, Long> { 

    @Query(value = "SELECT u FROM User u WHERE ....") 
    public Page<User> findEmployeeUsers(Pageable p); 
} 

projectionfindEmployeeUsers विधि के लिए निर्दिष्ट करने का कोई तरीका है जब इसे ऊपर की तरह सीधे कहा जाता है?

मुझे एहसास है कि ऊपर दिया गया कोड किसी के लिए अजीब लग सकता है ... आरईएसटी के माध्यम से भंडार का खुलासा करना और भंडार में @PreAuthorize चीज़ डालना संभव होगा। थॉट कंट्रोलर सुरक्षा जांच करने के लिए और अधिक सही जगह है - यह परीक्षण करने के लिए और अधिक प्राकृतिक और साथ ही सरल है।

तो, projection चीज़ किसी भी तरह से सीधे एक रिपोजिटरी विधि में पारित हो सकती है?

उत्तर

36

नहीं, यह विशेष रूप से अनुमानों के आधार पर किसी मामले पर एक प्रश्न निष्पादन के परिणाम पर अनुमान आमतौर पर लागू नहीं होते हैं। इस प्रकार वे वर्तमान में चुनिंदा रूप से डोमेन प्रकारों पर लागू होने के लिए डिज़ाइन किए गए हैं।

नवीनतम स्प्रिंग डेटा फाउलर रिलीज ट्रेन जीए रिलीज के रूप में प्रक्षेपण बुनियादी ढांचे को स्प्रिंग एमवीसी नियंत्रकों में प्रोग्रामेटिक रूप से उपयोग किया जा सकता है। तब

@Configuration 
class SomeConfig { 

    @Bean 
    public SpelAwareProxyProjectionFactory projectionFactory() { 
    return new SpelAwareProxyProjectionFactory(); 
    } 
} 

अपने नियंत्रक को इसकी सुई और प्रयोग यह:: बस SpelAwareProxyProjectionFactory के लिए एक स्प्रिंग की फलियों की घोषणा

@Controller 
class SampleController { 

    private final ProjectionFactory projectionFactory; 

    @Autowired 
    public SampleController(ProjectionFactory projectionFactory) { 
    this.projectionFactory = projectionFactory; 
    } 

    @PreAuthorize(value = "hasRole('ROLE_ADMIN')") 
    @RequestMapping(value = "https://stackoverflow.com/users/employee") 
    public Page<?> listEmployees(Pageable pageable) { 

    return usersRepository.findEmployeeUsers(pageable).// 
     map(user -> projectionFactory.createProjection(Projection.class, user); 
    } 
} 

देखें Page एक map(…) विधि है कि बदलने के लिए इस्तेमाल किया जा सकता है नवीनतम रिलीज के रूप में कैसे फ्लाई पर पेज सामग्री। हम ProjectionFactory का उपयोग करके रूपांतरण चरण प्रदान करने के लिए एक जेडीके 8 लैम्ब्डा का उपयोग करते हैं।

+0

धन्यवाद, यह एक सभ्य दृष्टिकोण की तरह दिखता है! दुर्भाग्यवश मैं इसका परीक्षण नहीं कर सकता क्योंकि मुझे स्प्रिंगबूट 1.2.2 (3) के साथ बंद कर दिया गया है - इसमें वसंत-डेटा प्रोजेक्ट के लैटर जीए संस्करण नहीं हैं ... मुझे एहसास है कि यह अलग-अलग प्रश्नों का विषय है - लेकिन इस चीज़ का परीक्षण करने के लिए GA को स्प्रिंगबूट 1.2.2 या 1.2.3 ऐप में डालने का कोई तरीका है? – Barbadoss

+1

यहां बताया जा सकता है कि यह कैसे किया जा सकता है - http://spring.io/blog/2015/03/26/what-s-new-in-spring-data-fowler, कोशिश करने जा रहा है और नए अनुमान बुनियादी ढांचे को आजमाएं। – Barbadoss

+0

@OliverGierke ऐसा प्रतीत होता है कि यह अब स्प्रिंग डेटा के वर्तमान संस्करण में काम नहीं करता है? प्रदान किए गए उदाहरण का उपयोग करते हुए, जैक्सन ने 'com.fasterxml.jackson.core.JsonGenerationException फेंकता है: किसी ऑब्जेक्ट को शुरू नहीं कर सकता, फ़ील्ड नाम की उम्मीद कर रहा है' –

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