2017-07-22 24 views
11

Ben bir model var dize ama uzun değil çalışır String, bu iyi çalışıyor. Bir numara Fakat (Long)Bahar Veri DİNLENME Özel Kaynak URI

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

çağırma: /myModels/1 alıyorum:

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] 
    ... 

ayrı özel EntityLookupSupport<MyModel> bileşen sınıfı eserler.

RepositoryRestConfigurerAdapter benim yöntem başvuruları kullanarak Long için çalışıyor almak için bir şey eksik mi?

+0

Temel veritabanı sütununun türü nedir? Sütun bir String mi? – Ben

+0

@Ben Veritabanı sütun tipi: int, Veritabanı: MySQL. Tür String ise, çalışır (dönüştürücü gerekmez, model alanı Long yerine String olur). Tip int (yabancı anahtar kısıtlamaları) ile çalışmak için ihtiyacım var. – rizjoj

+0

'/ myModels/1' yerine'/myModels/1L' öğesini çağırırsanız ne olur? Bir seri hale getirme sorunu olabilir –

cevap

0

sizin RepositoryEntityLookupConfig sınıfına bu eklemeyi deneyin:

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

Eklendi. Hala "java.lang.ClassCastException: java.lang.String java.lang.Long'a dönüştürülemez" alıyorum. – rizjoj

0

gerçekten kendiniz yapılandırmayı ayarlamak gerekiyor mu? Sen @RepositoryRestResource ek açıklaması ekleyerek yay önyükleme otomatik yapılandırmayı kullanmayı deneyebilirsiniz

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

Ayrıca modeli sınıfına @Entity eklemek

@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

Benim için çalışmadı. MyRepository üzerinde '@ RepositoryRestResource' ekleme (yapılandırmayı kaldırırken), varsayılan' findById' ile aynı etkiye neden olur. Model @Entity ile zaten açıklanmıştır ve sütun ek açıklama gerektirmez (aksi takdirde findByExternalId çalışır). – rizjoj

0

aramak çalışıyoruz yöntemin imza görünüyor be:

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

Java 8 ile çok tanıdık ancak MyModel::getExternalId gerekli dönüşüm yaparak nasıl görmüyorum değilim.

Şüphesiz ki 'basitleştirilmiş' bir Java 8 alternatif yapısı olan aşağıdaki gibi bir şey deneyeceğim.

@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); 
    } 
}