当前位置: 首页 > 知识库问答 >
问题:

Spring数据REST自定义资源URI适用于字符串,但不长

裘禄
2023-03-14

我有一个模型:

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

我想使用externalId作为我的资源标识符:

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

如果externalId是一个字符串,则可以正常工作。但是因为它是一个数字(

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

我是否错过了一些东西,让它在我的RepositoryRestConfigrerAdapter中使用方法引用为Long工作?


共有3个答案

曾英睿
2023-03-14

显然,默认的BackendIdConverter(请参见DefaultIdConverter)与ID转换无关,另一方面,Spring Data Rest无法使用存储库ID类型。因此,您必须自己进行转换,或者配置自定义ID转换器bean,例如:

@Bean
public BackendIdConverter myModelBackendIdConverter() {
  return new BackendIdConverter() {

    @Override
    public Serializable fromRequestId(final String id, final Class<?> entityType) {
      return Optional.ofNullable(id).map(Long::parseLong).orElse(null);
    }

    @Override
    public boolean supports(final Class<?> delimiter) {
      return MyModel.class.isAssignableFrom(delimiter);
    }

    @Override
    public String toRequestId(final Serializable id, final Class<?> entityType) {
      return Optional.ofNullable(id).map(Object::toString).orElse(null);
    }
  };
}

另见:

  • BackendIdHandlerMethodArgumentResolver
  • @BackendId
戚阳
2023-03-14

真的需要自己设置配置吗?您可以通过添加@RepositoryRestResources注释来尝试使用Spring启动自动配置

@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
}
华凯捷
2023-03-14

尝试将此添加到您的RepositoryEntityLookupConfig类:

@Override
public void configureConversionService(ConfigurableConversionService conversionService) {
    conversionService.addConverter(String.class, Long.class, Long::parseLong);
    super.configureConversionService(conversionService);
}
 类似资料:
  • 我使用spring boot和spring boot starter hateoas开发了一个rest服务。我在定制ObjectMapper时遇到了一个问题。代码如下: 一个pplication.java 依赖关系: 账单java: BillController.java: 我得到的输出是: 但是我需要“账单”代替“billList”。这是因为ObjectMapper没有被定制。我是否错过了任何配

  • 代码如下: 这是适配器,我在这里为列表做了自己的设计(< code>R.layout.zalistu),它在仿真器中工作,但在设备上它给我一个错误(应用程序意外停止),如果我使用< code>simple_list_item_1,那么它在仿真器和我的设备上都可以正常工作。 这里是R:layout.zalistu: 日志猫: 我设备上的Android版本是2.3.7,模拟器上的版本是4.0.4(AP

  • 以前,在自定义控制器中可以通过注入并使用方法来实现这一点,但最近的Spring Data Rest更新打破了这一点。 我希望在实体上强制执行一个特定的视图,而SDR预测似乎是这样做的理想方法,特别是在HAL API的上下文中,而不是为自定义控制器编写硬DTO类并在它们之间进行映射等。节选预测不是我想要的,因为这些仅适用于查看相关资源时。

  • 在我的数据库中,我有一个具有以下属性的表“CITA”:id,fecha\u hora,description,id\u empleado,id\u cliente。 我还有一个Spring JPA存储库: 我需要这个查询: 我的问题是我不知道我应该把它放在哪里来还给我像地图这样的东西 因为它不起作用: 编辑 如果我试图从我的REST控制器调用estadistic as(),我有一个错误。 这是我的

  • 问题内容: 我正在使用REST服务(使用Spring引导),该服务运行批处理作业。我希望Batch仅与嵌入式数据源(用于存储元数据)一起使用,而默认数据源(在我的情况下为Postgres)将用于存储企业实体。 问题在于,Batch会在启动时尝试在默认数据源中创建元数据表(如 batch_job_execution , batch_job_instance 等)。 这是重现问题的示例配置: 批处理配