我有一个通过自定义资源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,事情开始起作用......
作品:
不能工作:
不确定确切问题可能在哪里......