2015-09-10 4 views
17

में एक स्प्रिंग डेटा आरईएसटी यूआरआई को स्वीकार करना मेरे पास एक स्प्रिंग डेटा रेस्ट वेबएमवीसी एप्लीकेशन है जिसे मैं बैच ऑपरेशंस के लिए कुछ कस्टम कार्यक्षमता जोड़ना चाहता हूं।कस्टम नियंत्रक

मैंने एक नियंत्रक बनाया है, और इसे यूरी नेमस्पेस में मिश्रित किया है, लेकिन मैं चाहता हूं कि यह यूआरआई को कस्टम /search प्रश्नों को केवल आईडी के बजाय स्वीकार करने में सक्षम हो।

मैं दर्ज की कोशिश की है एक कस्टम <String, Long> कनवर्टर (मेरी इकाई एक Long आईडी प्रकार है, लेकिन उस पर ध्यान नहीं दिया करने के लिए लगता है। मेरे नियंत्रक कॉन्फ़िगर करने के लिए ऐसी है कि वह स्वत: लागू किया एसडीआर नियंत्रकों से उस व्यवहार को गोद ले कोई तरीका है?

यहां तक ​​कि अगर वहाँ विधि के कुछ प्रकार मैं उस इच्छा एक इकाई के लिए एक यूआरआइ ऑटो हल कॉल कर सकते हैं, कि बस के रूप में अच्छी तरह से काम करेगा (के रूप में मैं तो बस मेरे नियंत्रक में एक String स्वीकार कर सकते हैं)

यहाँ जहां मैं हूं।

@Configuration 
public class CustomWebConfiguration extends WebMvcConfigurationSupport { 

    //irrelevant code omitted 

    @Bean 
    public DomainClassConverter<?> domainClassConverter() { 
     DomainClassConverter<FormattingConversionService> dc = new DomainClassConverter<FormattingConversionService>(mvcConversionService()); 
     return dc; 
    } 

    @Override 
    public void addFormatters(FormatterRegistry registry) { 
      registry.addConverter(String.class, Long.class, testConverter()); 
    } 

    @Bean 
    Converter<String, Long> testConverter() { 
     return new Converter<String, Long>() { 

      @Override 
      public Long convert(String source) { 
       //this code does _not_ get run at any point 
       if (source.indexOf('/') == -1) { return Long.parseLong(source); } 

       source = source.substring(source.lastIndexOf('/') + 1); 
       Long id = Long.parseLong(source); 

       return id; 
      } 
     }; 
    } 
} 

एसडीआर कॉन्फ़िग

@Configuration 
@EnableHypermediaSupport(type = { HypermediaType.HAL }) 
public class CustomRestConfiguration extends RepositoryRestMvcConfiguration { 

    @Override 
    public RepositoryRestConfiguration config() { 
     RepositoryRestConfiguration config = super.config(); 
     config.setBasePath("/api"); 
     config.exposeIdsFor(ApplicationMembership.class); 
     return config; 
    } 


} 

और मेरे (काल्पनिक) नियंत्रक:

ApplicationType मेरी संस्थाओं में से एक है कि सही ढंग से एसडीआर/भंडार जादू

@BasePathAwareController 
@RepositoryRestController 
@RequestMapping("applications/special") 
public class ApplicationExtensionController { 
    @RequestMapping("a") 
    public ResponseEntity<?> reply(@RequestParam("type") ApplicationType type) { 
     return new ResponseEntity<String>(type.getIcon(), HttpStatus.OK); 
    } 
} 

मैं चारों ओर देखा है द्वारा प्रबंधित किया जाता है काफी कुछ लेकिन कुछ भी काम करने के लिए काफी प्रबंधन नहीं कर सकते हैं। जब मैं एक <String, ApplicationType> कनवर्टर कि भंडार का इस्तेमाल करता है बनाने के लिए, यह भी नहीं कहा जाता है मिल के रूप में DomainClassConverter सिर्फ उसके अंतर्निहित <String, Long> कनवर्टर (जो स्पष्ट रूप से विफल रहता है कहता है, इसे सही ढंग से एक लंबा में types/1 बाहर पार्स नहीं कर सकता के रूप में।

मदद की सराहना !

  • स्प्रिंग डाटा बाकी 2.4.0
  • स्प्रिंग HATEOAS 0.19.0
  • स्प्रिंग 4 उल्लेख करने के लिए भूल .2.1

का उपयोग जेपीए खजाने

+0

क्या आपने अपने नियंत्रक को @RepositoryRestController के साथ एनोटेट करने का प्रयास किया है? असल में, मुझे नियमित नियंत्रकों में PathVariables से एसडीआर इकाइयों को स्वत: प्राप्त करने में कोई समस्या नहीं थी, लेकिन फिर, मैं स्प्रिंग बूट का उपयोग कर रहा हूं और इसमें कुछ स्वत: कॉन्फ़िगरेशन भी शामिल है। –

+0

मैं इसे जाने दूंगा, धन्यवाद Ilya! – CollinD

+0

@IlyaNovoseltsev दुर्भाग्य से कोई पासा नहीं। मैं इसे पूछने में सक्षम होना चाहता हूं जैसे 'डोमेन /api/applications/batch/remove टाइप करें? प्रकार = प्रकार/7' लेकिन यह अभी भी त्रुटि को बदलने में असमर्थ है। – CollinD

उत्तर

4

जैसा कि यह पता चला है, मैं एक कनवर्टर जोड़ने के साथ सही रास्ते पर था, दुर्भाग्य से मैं इसे गलत कॉन्फ़िगरेशन विधि में कर रहा था।

मैं RepositoryRestMvcConfiguration विस्तार config वर्ग के लिए मेरी testConverter() सेम चलती है और फिर

@Override 
public void configureConversionService(ConfigurableConversionService service) { 
    service.addConverter(testConverter()); 
} 

जोड़ने और अपेक्षानुसार काम कर रहा द्वारा वांछित कार्यक्षमता प्राप्त करने में सक्षम था। मुझे पहली जगह गलत जगह पर फेंकने के लिए थोड़ा मूर्खतापूर्ण लगता है, लेकिन उम्मीद है कि यह किसी और की मदद करेगा!

+0

मैं इसे काम करने के लिए नहीं मिल सका। 'MvcConversionService()' क्या है? – aycanadal

+0

देखें: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.html#mvcConversionService - यह 'WebMvc कॉन्फ़िगरेशन समर्थन' बढ़ाकर प्रदान किया जाता है – CollinD

4

मैं अपने अंतिम टिप्पणी के आधार पर एक उत्तर पोस्ट कर रहा हूँ।

जाहिर तर्क की आवश्यकता - भंडार से प्रबंधित संस्था के लिए @RequestParam से यूआरआई autoconverting - RepositorySearchController की कुछ निजी विधियों (executeQueryMethod और prepareUris देखें) में कार्यान्वित किया जाता है, इसलिए वहां कोई आसान तरीका कस्टम नियंत्रकों में इसे पाने के लिए है ।

आप वसंत HATEOAS के साथ अपना तर्क समाधान बनाने का प्रयास कर सकते हैं। देखें कि कैसे PersistentEntityResourceHandlerMethodArgumentResolver रिज़ॉल्वर लागू किया गया है। इसने @BackendId के आधार पर एक इकाई का समाधान किया।

+0

क्या इसका पूरा कार्य उदाहरण नहीं है? नियंत्रक को myEntity पैरामीटर या यूआरआई पैरामीटर के लिए पूछना चाहिए? धन्यवाद – drenda

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