Spring Boot锁定代码以获取唯一id

2024-04-07

我编写了一个必须返回唯一字符串的控制器。要求是该控制器的两次调用永远不会返回相同的字符串,即使经过多年,即使代码将扩展到更多虚拟机。

我的问题是以下代码是否正确地实现了声明的目的,或者您是否有任何提示。

控制器:

@RestController
public class UtilityController {

    @Autowired
    UtilityServices utilityServices;

    @GetMapping("/uniqueIdentifier")
    @ResponseBody
    public String uniqueIdentifier() {
        return utilityServices.getUniqueIdentifier();
    }

Service:

@Service
public class UtilityServices {

    @Autowired
    private UniqueIdRepository uniqueIdRepository;

    @Transactional
    public String getUniqueIdentifier() {
       String uniqueId = RandomString.getSecureRandomString();
       while (uniqueIdRepository.existsById(uniqueId)) {
           uniqueId = RandomString.getSecureRandomString();
       }
       uniqueIdRepository.save(new UniqueId(uniqueId));
       return uniqueId;
    }
}

Entity:

@Entity
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@EqualsAndHashCode
@ToString
public class UniqueId implements Serializable {

    @Id
    private String uniqueId;   

}

存储库:

public interface UniqueIdRepository extends CrudRepository<UniqueId, String> {

}

就这样。我省略了代码RandomString类,因为它与此上下文无关:我编写了基于的代码SecureRandom,很可能每次它都会返回不同的字符串,但我对此无法保证。让我们假设迟早我的RandomString.getSecureRandomString()方法可以返回相同的字符串。

我不确定是否@Transactional注释保证getUniqueIdentifier()方法永远不会抛出错误。


针对您的情况,更好的想法是使用UUID https://en.wikipedia.org/wiki/Universally_unique_identifier?wprov=sfla1:

因此,任何人都可以创建一个 UUID 并用它来识别某些东西,并且几乎可以肯定该标识符不会与已经或将要创建的用于识别其他东西的标识符重复。因此,由独立方标记为 UUID 的信息随后可以合并到单个数据库中或在同一通道上传输,而重复的可能性可以忽略不计。

@Service
public class UtilityServices {
    @Autowired
    private UniqueIdRepository uniqueIdRepository;

    @Transactional
    public String getUniqueIdentifier() {
       String uniqueId = String.format("%s-%s",
            RandomStringUtils.randomAlphanumeric(4),
            UUID.randomUUID().toString().replace("-", "")
       );
       // you could left this check 
       while (uniqueIdRepository.existsById(uniqueId)) {
           uniqueId = UUID.randomUUID().toString().replace("-", "");
       }
       uniqueIdRepository.save(new UniqueId(uniqueId));
       return uniqueId;
    }
}

BTW你可以用@Data对于型号:

@Data
@Entity
@NoArgsConstructor
@AllArgsConstructor
public class UniqueId implements Serializable {
    private static final long serialVersionUID = 0L;
    @Id
    private String uniqueId;   
}

并且不要忘记serialVersionUID.

有用的参考:

  • 什么是serialVersionUID?为什么要使用它? https://stackoverflow.com/questions/285793/what-is-a-serialversionuid-and-why-should-i-use-it
  • 感谢@M.Deinum@实体的数据详细信息 https://stackoverflow.com/a/58505239/1498427
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot锁定代码以获取唯一id 的相关文章

随机推荐