我编写了一个必须返回唯一字符串的控制器。要求是该控制器的两次调用永远不会返回相同的字符串,即使经过多年,即使代码将扩展到更多虚拟机。
我的问题是以下代码是否正确地实现了声明的目的,或者您是否有任何提示。
控制器:
@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()
方法永远不会抛出错误。