Я создал приложение Spring Boot с помощью JDBCTemplate, которое запускается и работает нормально, без ошибок и исключений.
Я создал тестовый класс и хочу использовать @JdbcTest для тестирования моих объектов Dao. Однако каждый раз, когда я запускаю тест, я получаю java.lang.IllegalStateException: не удалось загрузить ApplicationContext. Кажется, возникла проблема с моими классами контроллера. Это IllegalStateException вызвано:
Код: Выделить всё
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'assetApiController' defined in file [/PATH/TO/FILE]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.fasterxml.jackson.databind.ObjectMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
Код: Выделить всё
@JdbcTest
@Sql({"schema.sql", "test-data.sql"})
class AssetApiControllerTest {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
AssetDao assetDao;
@Test
void delete() throws DataAccessException {
assetDao.setJdbcTemplate(jdbcTemplate);
assetDao.deleteByPk(new AssetKey(1), null);
assertEquals(0, assetDao.selectAll(null).size());
}
}
Код: Выделить всё
@Repository("assetDao")
public class AssetDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void deleteByPk (AssetKey assetKey, Connection con) throws DataAccessException {
jdbcTemplate.update("DELETE FROM Asset WHERE id = ? ", assetKey.getId());
}
}
Код: Выделить всё
@Controller
public class AssetApiController implements AssetApi {
private static final Logger log = LoggerFactory.getLogger(AssetApiController.class);
private final ObjectMapper objectMapper;
private final HttpServletRequest request;
@Autowired
private AssetDao assetDao;
@org.springframework.beans.factory.annotation.Autowired
public AssetApiController(ObjectMapper objectMapper, HttpServletRequest request) {
this.objectMapper = objectMapper;
this.request = request;
}
@Override
public ResponseEntity delete(@RequestBody AssetKey assetKey) {
try{
assetDao.deleteByPk(assetKey, null);
} catch (ApplicationException e) {
log.warn(e.getFormattedMessage(), e);
return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
}
return new ResponseEntity(HttpStatus.OK);
}
}
Код: Выделить всё
@Configuration
public class JacksonConfiguration {
@Bean
@ConditionalOnMissingBean(ThreeTenModule.class)
ThreeTenModule threeTenModule() {
ThreeTenModule module = new ThreeTenModule();
module.addDeserializer(Instant.class, CustomInstantDeserializer.INSTANT);
module.addDeserializer(OffsetDateTime.class, CustomInstantDeserializer.OFFSET_DATE_TIME);
module.addDeserializer(ZonedDateTime.class, CustomInstantDeserializer.ZONED_DATE_TIME);
return module;
}
}
- Я последовал этому ответу: https://stackoverflow.com/a/32842962/11853066. И это устранило проблему, но затем я получил эквивалентную ошибку для HttpServletRequest: не найден соответствующий bean-компонент для зависимости [javax.servlet.http.HttpServletRequest]. Таким образом, основная проблема не была решена.
- Когда я пытаюсь создать тесты для объекта, отличного от актива (например, «Поставщик» с поставщикомController, ПоставщикДао), я получаю ту же ошибку: Ошибка создания bean-компонента с именем «assetApiController», определенным в файле. Должно быть, это связано с тем, что assetsApiController является первым контроллером, который сканируется в алфавитном порядке?
Подробнее здесь: https://stackoverflow.com/questions/650 ... son-databi
Мобильная версия