我正在使用Spring Boot 2.1.2版本(mongodb-driver v 3.8.2)并开发可与mongodb一起运行的Web应用程序。我的应用程序与mongodb 3.4版本兼容(此版本不支持事务),现在我要介绍事务机制。我用事务注释来注释我的服务方法
@Transactional
public void process(Object argument) {
...
...
...
}
它在mongodb v 4上运行良好,一切都在预期之中-失败的事务将回滚。
但是,当我使用mongodb v 3.4启动我的应用程序时,我的应用程序因
而崩溃Sessions are not supported by the MongoDB cluster to which this client is connected
例外。
问题是我希望我的应用程序支持两种情况:具有相同代码的事务性和非事务性(对于两个mongodb版本)。所以我想知道我该怎么做?似乎我的应用程序应仅针对特定版本的mongo创建会话,即仅应在这种情况下处理此批注。
我该怎么办?
答案 0 :(得分:1)
不确定它是否有效,但是您可以尝试将 class ShoppingCart2{
private String[] arrayItems;
private int numItems;
public ShoppingCart2(){
arrayItems = new String[20];
numItems = 0;
}
public void addItems(String itemName){
for(int i = 0; i < numItems; i++){
if(numItems==arrayItems.length)
System.out.println("Cart is full.");
else{
arrayItems[numItems]= itemName;
numItems++;
}
}
}
public ShoppingCart2 getTotal(){
ShoppingCart2 total = new ShoppingCart2();
for(int i = 0; i < numItems; i++){
/////I've tried several different methods here, they always
////lead to either
/// a need to dereference or the non static method error
}
return total;}
public String toString() {
NumberFormat fmt = NumberFormat.getCurrencyInstance();
String cart = "\nShopping Cart\n";
for (int i = 0; i < numItems; i++)
cart += arrayItems[i] + "\n";
cart += "\nTotal Price: " + fmt.format(total);
cart += "\n";
return cart;
}
}
注释移至新的配置类,将注释@EnableTransactionManagement
和@Configuration
添加到配置类,然后运行需要自动配置事务管理时,使用给定配置文件的应用程序,例如使用:
@Profile("enableTransactions")
答案 1 :(得分:1)
我找到了解决方案。 Spring在创建事务之前检查当前上下文中PlatformTransactionManager
是否存在。因此,如果未定义此bean,则不会打开会话进行事务处理。因此,我在配置类中为此使用了条件豆:
@Bean
@Autowired
@ConditionalOnExpression("'${mongo.transactions}'=='enabled'")
MongoTransactionManager mongoTransactionManager(MongoDbFactory dbFactory) {
return new MongoTransactionManager(dbFactory);
}
因此,仅在mongo.transactions参数设置为enabled的情况下,才会创建MongoTransactionManager
bean。