PUT / PATCH上自定义资源URI的Spring Data REST失败 - Spring Boot 2.0

时间:2018-04-02 23:39:53

标签: rest jpa spring-data-jpa spring-data-rest spring-hateoas

我有一个通过自定义资源URI访问的资源。我要求主键不能直接显示在资源URI中。所以我修改了我的REST配置以提供修改后的EntityLookup。

适当的摘录如下......

修改后的配置:

@Component
public class SpringDataMyDataRestCustomization extends RepositoryRestConfigurerAdapter {

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {

        /**
         * Setup hashed ID URIs
         */
        config.withEntityLookup().
                forRepository(MyDataRepository.class, MyData::getIdHash, IMIncidentRepository::findByIdHash);
    }
}

实体类(您可以在此处看到我使用虚拟列来创建主键的哈希值):

@Entity
class MyData {

    @Id
    @Column(name = "MyDataKey")
    public Long getMyDataKey() {
         return myDataKey;
    }

    public void setMyDataKey(Long myDataKey) {
        this.myDataKey= myDataKey;
    }

    @Formula("CONVERT(VARCHAR(32), HashBytes('MD5', LTRIM(myDataKey)), 2)")
    public String getIdHash() {
        return DigestUtils.md5Hex(myDataKey.toString());
    }

    public void setIdHash(String idHash) {
        this.idHash = idHash;
    }
    ....
}

存储库:

public interface MyDataRepository extends PagingAndSortingRepository<MyData, Long> {

    Optional<MyData> findByIdHash(@Param("idHash") String idHash);
}

这一切都适用于GET请求。我能够获得带有散列主键的URI,并且可以很好地检索资源。但是,当我想添加或更新资源时,它会失败并出现以下异常:

Failed to convert from type [java.lang.String] to type [java.lang.Long]
for value '09d8d1d6e2538a02bac5fe033e2af92e'; nested exception is 
java.lang.NumberFormatException: For input string: \"09d8d1d6e2538a02bac5fe033e2af92e\"

因此,看起来它试图将散列ID作为主键并将其设置在我的实体上。当然,这会失败,因为它无法将该String转换为Long。

我是否有错误的设置?关于如何以不同的方式做到这一点的任何想法?

修改 经过进一步审查,这似乎是Spring Boot 2.0的回归。我降级到1.5.10,事情开始起作用......

作品:

  • Spring Boot 1.5.10
  • Spring Data Rest 2.6.10

不能工作:

  • Spring Boot 2.0.0
  • Spring Data Rest 3.0.5

不确定确切问题可能在哪里......

0 个答案:

没有答案