2017-07-22 16 views
11

मैं एक मॉडल है:स्प्रिंग डाटा बाकी कस्टम संसाधन URI स्ट्रिंग लेकिन लंबे समय के लिए काम करता नहीं

@Configuration 
static class RepositoryEntityLookupConfig extends RepositoryRestConfigurerAdapter { 
    @Override 
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration configuration) { 
     configuration 
       .withEntityLookup() 
        .forRepository(MyRepository.class, MyModel::getExternalId, MyRepository::findByExternalId); 
    } 
} 

तो externalId एक है:

public class MyModel { 
    @Id private Long id; 
    private Long externalId; 
    // Getters, setters 
} 

मैं अपने संसाधन पहचानकर्ता के रूप में externalId उपयोग करना चाहते हैं String, यह ठीक काम करता है। लेकिन क्योंकि यह एक संख्या है (Long)

public interface MyRepository extends JpaRepository<MyModel, Long> { 
    Optional<MyModel> findByExternalId(@Param("externalId") Long externalId); 
} 

जब लागू: /myModels/1 मैं:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long 
    at org.springframework.data.rest.core.config.EntityLookupConfiguration$RepositoriesEntityLookup.lookupEntity(EntityLookupConfiguration.java:213) ~[spring-data-rest-core-2.6.4.RELEASE.jar:na] 
    at org.springframework.data.rest.core.support.UnwrappingRepositoryInvokerFactory$UnwrappingRepositoryInvoker.invokeFindOne(UnwrappingRepositoryInvokerFactory.java:130) ~[spring-data-rest-core-2.6.4.RELEASE.jar:na] 
    at org.springframework.data.rest.webmvc.RepositoryEntityController.getItemResource(RepositoryEntityController.java:524) ~[spring-data-rest-webmvc-2.6.4.RELEASE.jar:na] 
    at org.springframework.data.rest.webmvc.RepositoryEntityController.getItemResource(RepositoryEntityController.java:335) ~[spring-data-rest-webmvc-2.6.4.RELEASE.jar:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_111] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_111] 
    ... 

एक अलग कस्टम EntityLookupSupport<MyModel> घटक वर्ग काम करता है।

क्या मुझे Long के लिए RepositoryRestConfigurerAdapter में विधि संदर्भों का उपयोग करने के लिए कुछ मिल रहा है?

+0

अंतर्निहित डेटाबेस कॉलम का प्रकार क्या है? कॉलम एक स्ट्रिंग है? – Ben

+0

@बेन डेटाबेस कॉलम प्रकार: int, डेटाबेस: MySQL। यदि प्रकार स्ट्रिंग थे, तो यह काम करता है (कोई कनवर्टर आवश्यक नहीं है, मॉडल फ़ील्ड लंबे समय के बजाय स्ट्रिंग होगा)। मुझे टाइप int (विदेशी कुंजी बाधाओं) के साथ काम करने की ज़रूरत है। – rizjoj

+0

क्या होगा यदि आप '/ myModels/1' के बजाय'/myModels/1L' को कॉल करते हैं? यह एक क्रमबद्धता मुद्दा हो सकता है –

उत्तर

0

अपने RepositoryEntityLookupConfig वर्ग में जोड़ने के लिए प्रयास करें:

@Override 
public void configureConversionService(ConfigurableConversionService conversionService) { 
    conversionService.addConverter(String.class, Long.class, Long::parseLong); 
    super.configureConversionService(conversionService); 
} 
+0

इसे जोड़ा गया। मुझे अभी भी "java.lang.ClassCastException: java.lang.String java.lang.Long पर नहीं डाला जा सकता है"। – rizjoj

0

तुम सच में अपने आप को द्वारा विन्यास निर्धारित करने की आवश्यकता है? आप @RepositoryRestResource एनोटेशन जोड़कर वसंत-बूट ऑटो विन्यास का उपयोग करने की कोशिश कर सकते

@RepositoryRestResource(collectionResourceRel = "myModels", path = "myModels") 
public interface MyRepository extends JpaRepository<MyModel, Long> { 
     Optional<MyModel> findByExternalId(@Param("externalId") Long externalId); 
} 

इसके अलावा अपने मॉडल वर्ग पर @Entity जोड़ने

@Entity 
public class MyModel { 
    @Id 
    private Long id; 
    @Column(name = "EXTERNAL_ID") 
    // Column annotation is not required if you respect case-sensitive 
    private Long externalId; 
    // Getters, setters 
} 
+0

मेरे लिए काम नहीं किया। MyRepository पर '@ रिपोजिटरी रीस्ट रिसोर्स' जोड़ना (कॉन्फ़िगरेशन को हटाते समय) परिणामस्वरूप डिफ़ॉल्ट 'findById' के समान प्रभाव होते हैं। मॉडल पहले से ही @ एन्टीटी के साथ एनोटेट किया गया है और कॉलम को एनोटेशन की आवश्यकता नहीं है (findByExternalId अन्यथा काम करता है)। – rizjoj

0

विधि आप कॉल करने के लिए कोशिश कर रहे हैं के हस्ताक्षर करने लगता है हो:

forRepository(Class<R> type, Converter<T,ID> identifierMapping, 
     EntityLookupRegistrar.LookupRegistrar.Lookup<R,ID> lookup) 

मैं जावा 8 साथ बहुत परिचित नहीं हूँ लेकिन मैं नहीं दिख रहा है कि कैसे MyModel::getExternalId आवश्यक रूपांतरण कर जा सकता है।

मैं निम्नलिखित की तरह कुछ कोशिश करता हूं जिसमें कोई संदेह नहीं है कि 'सरलीकृत' जावा 8 वैकल्पिक निर्माण है।

@Configuration 
static class RepositoryEntityLookupConfig extends RepositoryRestConfigurerAdapter { 
    @Override 
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration configuration) { 

    Converter<String, Long> converter = new Converter(){ 
     public Long convert(String source){ 
      return Long.parseLong(source); 
     } 
    }; 

    configuration 
       .withEntityLookup() 
        .forRepository(MyRepository.class, converter, MyRepository::findByExternalId); 
    } 
} 
संबंधित मुद्दे