2015-10-28 9 views
5

मेरी आवश्यकता क्लाइंट ऐप में डेटा बाधाओं या डिफ़ॉल्ट मानों के बारे में जानकारी देना है जो API का उपयोग करेगा। Spring Data Rest द्वारा उत्पन्न स्कीमा या ALPS इस जानकारी को रखने के लिए एक अच्छी जगह प्रतीत होती है।वसंत डेटा आराम - कस्टम जेसन स्कीमा/आल्प्स?

लेकिन एपीआई दस्तावेज करने का हिस्सा आधिकारिक संदर्भ दस्तावेज में थोड़ा तेज़ है, और मुझे समुदाय में पूरी तरह से प्रलेखित उदाहरण नहीं मिल रहा है। मैंने प्रस्तावित संभावनाओं की अंतर्दृष्टि रखने के लिए PersistentEntityToJsonSchemaConverter के कोड को पढ़ने का प्रयास किया है, लेकिन सिरदर्द पहले पहुंचा।

मुझे पता है कि @Description एनोटेशन है कि मैं संस्थाओं और गुणों पर रख सकता हूं जो स्कीमा के title फ़ील्ड को बदल देंगे। मुझे पता है कि rest-messages.properties

क्या अन्य फ़ील्ड हैं जिन्हें एनोटेशन या कॉन्फ़िगरेशन फ़ाइलों द्वारा संशोधित किया जा सकता है? इस विवरण फ़ील्ड में डिफ़ॉल्ट या बाधाओं की जानकारी डालने से वास्तव में ऐसा लगता है कि इसका उपयोग सीधे नहीं किया जा रहा है।

उत्तर

3

प्रश्न लगभग पुराना है, मुझे नहीं पता कि आपको पहले से ही समाधान मिल गया है या नहीं।

कहीं भी, यदि आप वसंत द्वारा उपयोग किए गए कन्वर्टर्स को प्रतिस्थापित करने वाले दो कस्टम कन्वर्टर्स बनाते हैं तो आप एक पूरी तरह से कस्टम एएलपीएस प्रोफाइलिंग जानकारी बना सकते हैं।

पहले व्यक्ति को कनवर्टर org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter विस्तारित करने की आवश्यकता है।

यहाँ एक संभव कार्यान्वयन:

public class CustomAlpsJsonHttpMessageConverter extends AlpsJsonHttpMessageConverter { 

    public CustomAlpsJsonHttpMessageConverter(RootResourceInformationToAlpsDescriptorConverter converter) { 
     super(converter); 
    } 

    @Override 
    public boolean canWrite(Class<?> clazz, MediaType mediaType) { 
     return super.canWrite(clazz, mediaType); 
    } 

    @Override 
    public boolean canRead(Type type, Class<?> contextClass, MediaType mediaType) { 
     return super.canRead(type, contextClass, mediaType); 
    } 

    @Override 
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, 
      Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, 
      ServerHttpResponse response) { 
     return super.beforeBodyWrite(body, returnType, selectedContentType, selectedConverterType, request, response); 
    } 

    @Override 
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { 
     if (converterType.equals(AlpsJsonHttpMessageConverter.class)) 
      return true; 
     else if (converterType.equals(CustomAlpsJsonHttpMessageConverter.class)) 
      return true; 
     else return false; 
    } 

} 

दूसरा एक की जरूरत है कनवर्टर org.springframework.data.rest.webmvc.alps.RootResourceInformationToAlpsDescriptorConverter फैली हुई है।

RootResourceInformationToAlpsDescriptorConverter में केवल दो सार्वजनिक संसाधन हैं: कन्स्ट्रक्टर और "कन्वर्ट" विधि।

यदि आप कस्टम व्यवहार करना चाहते हैं तो आप उस वर्ग के प्रत्येक निजी क्षेत्र/विधि को ओवरराइट कर सकते हैं।

वेतन ध्यान कि "का समर्थन करता है" अपने CustomAlpsJsonHttpMessageConverter की विधि की आवश्यकता होगी अपने नए CustomAlpsJsonHttpMessageConverter वर्ग के साथ दिए गए "converterType" मेल खाता है।

आप बस अपने CustomRootResourceInformationToAlpsDescriptorConverter में यह ovverriding वर्ग RootResourceInformationToAlpsDescriptorConverter की "कन्वर्ट" विधि अनुकूलित कर सकते हैं, उस बिंदु पर।

अंत में, आपको एप्लिकेशन संदर्भ में दो कन्वर्टर्स पंजीकृत करना होगा। ऐसा करने के लिए, आप RepositoryRestMvcConfiguration कक्षा का विस्तार कर सकते हैं, और आपके CustomRepositoryRestMvcConfiguration में आपको @Override विधियों "alpsJsonHttpMessageConverter()" और "alpsConverter()" की आवश्यकता होगी।

भी जोड़ें दो ovverriding कस्टम तरीकों में @Bean एनोटेशन, इस तरह:

@Bean 
@Override 
public AlpsJsonHttpMessageConverter alpsJsonHttpMessageConverter() { 
    return new CustomAlpsJsonHttpMessageConverter(alpsConverter()); 
} 

@Bean 
@Override 
public RootResourceInformationToAlpsDescriptorConverter alpsConverter() { 
    Repositories repositories = repositories(); 
    PersistentEntities persistentEntities = persistentEntities(); 
    RepositoryEntityLinks entityLinks = entityLinks(); 
    MessageSourceAccessor messageSourceAccessor = resourceDescriptionMessageSourceAccessor(); 
    RepositoryRestConfiguration config = config(); 
    ResourceMappings resourceMappings = resourceMappings(); 

    return new CustomRootResourceInformationToAlpsDescriptorConverter(associationLinks(), repositories, persistentEntities, 
      entityLinks, messageSourceAccessor, config, objectMapper(), enumTranslator()); 
} 

तो तुम अगर आप की जरूरत है एक पूरी तरह से कस्टम आल्प्स हो सकता है,।

मैंने कस्टम प्रोफाइलिंग लिंक बनाने के लिए इस समाधान की कोशिश की है, और यह पूरी तरह से काम करता है।

+0

धन्यवाद! मैं इस परियोजना पर अब काम नहीं करता हूं, और इसके लिए हमने एक बाहरी दस्तावेज़ समाप्त कर दिया है, स्वयं समझाए गए एपीआई की "सुंदरता" काट रहा है वैसे भी, मैं आपके पूर्व टीमों को अंतर्दृष्टि रखने के लिए अपने उत्तर को लिंक करूंगा क्लीनर दस्तावेज पर वापस जाने के लिए क्या करना है। –

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