我目前正在尝试使用Spring中的MongoRepository更新一个文档,该文档正在连接到AWS DocumentDB集群。我收到一个301-不支持可重试写入错误,即使用于连接到DocumentDB的URL包括retryWrites=false
,所以我不知道应该如何更新文档,也不知道是否应该在Spring中从其他地方禁用retryWrites。
DocumentDB连接的URL如下所示:mongodb://<username>:<password>@mongo-dev-cluster.cluster-xxxxx.eu-west-2.docdb.amazonaws.com:27017/?replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false
模型、存储库和服务的代码如下所示:
@Service
public class CarService {
@Autowired
private CarRepository carRepository;
public void update(String id, Car car) {
// Just saving wouldn't work because there is an indexed key
car.setId(id);
carRepository.save(car);
}
}
@Repository
public interface CarRepository extends
MongoRepository<Car, String> {
}
@Document
@TypeAlias("car")
public class Car {
@Id
private String id;
@Indexed(unique = true)
private String carName;
private String color;
}
application.properties如下所示:
spring.data.mongodb.username=${DATABASE_USERNAME}
spring.data.mongodb.password=${DATABASE_PASSWORD}
spring.data.mongodb.database=cars-db
spring.data.mongodb.port=27017
spring.data.mongodb.host=mongo-dev-cluster.cluster-xxxxx.eu-west-2.docdb.amazonaws.com
在更新要保持ID和索引值相等的文档时,如何阻止此错误的发生?
我发现自己做错了什么。我在Spring中将MongoDB配置为使用主机和端口,这意味着retryWrites=false
从未被读取。相反,我将application.properties
更改为使用URI而不是主机和端口
spring.data.mongodb.database=cars-db
spring.data.mongodb.uri=mongodb://<username>:<password>@mongo-dev-cluster.cluster-xxxxx.eu-west-2.docdb.amazonaws.com:27017/?retryWrites=false`
这意味着retryWrites=false
属性现在被正确读取,而以前,它显然只读取主机名,因此没有禁用可重试写入。