Spring 데이터 MongoTemplate이 DataAccessException을 발생시키지 않습니다.
-
11-12-2019 - |
문제
저는 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에 도달하지 못한 것을 볼 수 있습니다.
그래서,, 내가 뭔가 잘못하고 있는 것 같지만, 지금은,, 내 실수에 눈이 멀었습니다.
//엘지
해결책
구성했는지 확인하세요. WriteConcern
~의 MongoTemplate
기본값이 아닌 것으로(예: WriteConcern.SAFE
).기본적으로 MongoDB는 Fire-and-forget 모드에 있으며 일반적으로 인덱스 위반이나 서버 오류에 대한 예외를 발생시키지 않습니다.
다른 팁
여전히 이것으로 고생합니다. Finnally 나는 이식 번역을 일하기 위해 성공했다.MongoDB는 Spring 데이터 예외로 변환되는 예외를 throw합니다.
이제는 또 다른 문제가 있습니다.
위의 DAO는 다음 코드가 있습니다.
@ExceptionHandler(DataAccessException.class)
public void handleDataAccessException(DataAccessException ex) {
// For debug only
DataAccessException test = ex;
test.printStackTrace();
}
.
이 코드가 예외를 잡을 것으로 예상을 기대하고 있었지만 이것은 그렇지 않습니다.
왜 그렇지 않습니까?
// lasse
제휴하지 않습니다 StackOverflow