1

我正在尝试学习 MongoDB,同时使用 Spring 框架编写一个简单的 REST 应用程序。

我有一个简单的模型:

@Document
public class Permission extends documentBase{

@Indexed(unique = true)
private String name;

public   Permission(String name) {
    this.name = name;       
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

然后我有一个简单的 DAO:

@Repository
@Transactional 
@Profile({"production","repositoryTest","mongoIntegrationTest"})
public class DaoImpl   implements DAO  {

@Autowired
protected MongoTemplate mongoTemplate;

public <T> T addObject(T object) {               
     mongoTemplate.insert(object);        
     return object; 
}

我有我的集成测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:mvc-dispatcher-servlet.xml", classpath:IntegrationContext.xml"},loader = TestXmlContextLoader.class)
@ActiveProfiles("mongoIntegrationTest")
public class RepositoryIntegrationTest extends AccountTestBase{

    @Autowired DAO repository;
    @Autowired WebApplicationContext wac;

    @Test
public void AddPermission() { 
    Permission permission_1 = new Permission("test");           
    Permission permission_2 = new Permission("test");           
    repository.addObject(permission_1);
    repository.addObject(permission_2);
}
}

我的配置:

 <!-- MongoDB host -->
 <mongo:mongo host="${mongo.host.name}" port="${mongo.host.port}"/> 

 <!-- Template for performing MongoDB operations -->
 <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate" 
c:mongo-ref="mongo" c:databaseName="${mongo.db.name}"/>

我预计,在添加“permission_2”时,它们将是从 MongoDB 抛出的异常,该异常将由 Spring 翻译,并在 DAO 中作为 DataAccessException 捕获。

查看来自 MongoDb 的日志文件,我可以看到引发了重复的异常,但它从未到达我的 DAO。

所以,我想我做错了什么,,但此刻,我对自己的错误视而不见。

//lg

4

2 回答 2

4

确保将WriteConcern的配置MongoTemplate为非默认值(例如WriteConcern.SAFE)。默认情况下,MongoDB 处于即发即弃模式,通常不会在索引违规或服务器错误时引发异常。

于 2012-10-04T15:33:40.730 回答
1

仍在为此苦苦挣扎。最后我成功地让例外翻译工作。MongoDb 抛出一个异常,该异常被转换为 Spring Data 异常。

现在我遇到了另一个问题。

上面显示的我的 DAO 也有以下代码:

     @ExceptionHandler(DataAccessException.class)
     public void handleDataAccessException(DataAccessException ex) {
            // For debug only
                            DataAccessException test = ex;
            test.printStackTrace();

      }

我希望这段代码能够捕获抛出的异常,但事实并非如此。

为什么不?

//lasse

于 2012-10-23T17:51:34.500 回答