我们担心将内部ID暴露给外界。因此,我正在考虑使用一种哈希机制(当前选择为hashid)来哈希我们的ID。
我尝试在实体ID字段上使用@JsonSerializer和@JsonDeserializer映射。但这仅在将ID包含在正文中时才生效,并且对URL路径中的ID没有影响。
是否有可能这样做,例如像ID转换SPI之类的东西?
答案 0 :(得分:0)
我唯一能想到的就是创建一个请求过滤器,该过滤器将接受URL中带有编码ID的请求,然后对ID进行解码并重定向到具有解码ID的URL。
答案 1 :(得分:0)
您需要的是customizing item resource URIs在Spring Data REST中“从盒子里直接进行”工作:
@Configuration
public class RestConfigurer extends RepositoryRestConfigurerAdapter {
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
config.withEntityLookup().forRepository(ModelRepo.class, model -> HashIdUtil.encode(model.getId()), ModelRepo::findByEncodedId);
super.configureRepositoryRestConfiguration(config);
}
}
public interface ModelRepo extends JpaRepository<Model, Long> {
default Model findByEncodedId(String encodedId) {
return getById(HashIdUtil.decode(encodedId));
}
Model getById(Long id);
}
public class HashIdUtil {
private static final Hashids HASHIDS = new Hashids("salt", 8);
public static String encode(Long source) {
return HASHIDS.encode(source);
}
public static Long decode(String source) {
return HASHIDS.decode(source)[0];
}
}
不幸的是,due to the bug(我想),PUT / PATCH-ing实体在Spring Boot 2+中不起作用,这与SB(1.5+)的先前版本不同,它可以按预期工作。
观看我的演示:sdr-hashids-demo