Я хочу настроить на xml JdbcTemolate.
это выглядит так
<context:property-placeholder location="classpath:db/postgres.properties"/>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${database.driverClassName}"/>
<property name="url" value="${database.url}"/>
<property name="username" value="${database.username}"/>
<property name="password" value="${database.password}"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg ref="dataSource"/>
</bean>
<bean id="namedJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dataSource"/>
</bean>
, но я получаю такую ошибку
Причина: org.springframework.beans.factory.UnsatisfiedDependencyException: Ошибка создания компонента с именем 'jdbcMealServiceImpl': неудовлетворенная зависимость, выраженная через поле 'jdbcMealRepository'; вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: отсутствует квалифицируемый компонент типа 'ru.demo.exercise.repository.jdb c .JdbcMealRepository': ожидается, что по крайней мере 1 компонент будет квалифицирован как кандидат для автоматической передачи. Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (обязательно = true)} в org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject (AutowiredAeg * 1022. Org. springframework.beans.factory.annotation.InjectionMetadata.inject (InjectionMetadata. java: 116) в org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties (AutowiredAnost.Probe *. factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory. java: 1429) в org.springframework.beans.factory.support.AbstractAutowireCapable. AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory. java: 517) в org.springframework.beans.factory.support.AbstractBeanFacto ry.lambda $ doGetBean $ 0 (AbstractBeanFactory. java: 323) в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry. java: 222) в org.sory.Beans.befra .doGetBean (AbstractBeanFactory. java: 321) в org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory. java: 202) в org.springframework.beans. . java: 276) в org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory. java: 1287) в org.springframework.beans.factory *beoryFactoryDetableFile : 1207) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject (AutowiredAnnotationBeanPostProcessor. java: 636) ... опущено 61 общих фреймов. Вызвано: org.springme. factory.NoSuchBeanDefinitionException: нет квалифицированного компонента типа 'ru.demo.exercise.repository.jdb c .JdbcMealRepository': ожидается как минимум 1 компонент, который квалифицируется как кандидат для автоматического подключения. Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (обязательный = true)} в org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound (DefaultListableBeanFrag.info). beans.factory.support.DefaultListableBeanFactory.doResolveDependency (DefaultListableBeanFactory. java: 1253) в org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency (по умолчаниюLifeory.Feory. annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject (AutowiredAnnotationBeanPostProcessor. java: 636) ... пропущено 74 общих фрейма
Это мой JdbcService:
@Service
public class JdbcMealServiceImpl implements MealService {
@Autowired
JdbcMealRepository jdbcMealRepository;
@Override
public Meal save(Meal meal) {
return jdbcMealRepository.save(meal);
}
@Override
public Meal get(int id) {
return jdbcMealRepository.get(id);
}
@Override
public List<Meal> getAll() {
return jdbcMealRepository.getAll();
}
@Override
public void delete(int id) {
jdbcMealRepository.delete(id);
}
@Override
public void update(Meal meal) {
jdbcMealRepository.update(meal);
}
}
J5 * * 133 * *
@Repository
public abstract class JdbcMealRepository implements MealRepository {
private static final BeanPropertyRowMapper<Meal> ROW_MAPPER = BeanPropertyRowMapper.newInstance(Meal.class);
@Autowired
private final JdbcTemplate jdbcTemplate;
private final SimpleJdbcInsert insertMeals;
@Autowired
private final NamedParameterJdbcTemplate namedParameterJdbcTemplate;
@Autowired
protected JdbcMealRepository(JdbcTemplate jdbcTemplate, NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
this.insertMeals = new SimpleJdbcInsert(jdbcTemplate)
.withTableName("meals")
.usingGeneratedKeyColumns("id");
this.jdbcTemplate = jdbcTemplate;
this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
}
@Override
public Meal save(Meal meal) {
MapSqlParameterSource map = new MapSqlParameterSource()
.addValue("id", meal.getId())
.addValue("date_time", meal.getDatetime())
.addValue("description", meal.getDatetime())
.addValue("calories", meal.getCalories());
namedParameterJdbcTemplate.update("INSERT INTO meals(id, date_time, description, calories) " +
"VALUES(id=:id, date_time=:date_time, description=:description, calories=:calories)", map);
return meal;
}
}
Контроллер:
@Controller
public class JspMealController {
@Autowired
JdbcMealServiceImpl mealService;
@GetMapping(value = "/list")
public String getAll(Model model) {
model.addAttribute("meals", mealService.getAll());
return "meals";
}
@GetMapping(value = "/createForm")
public String addForm(Model model) {
Meal meal = new Meal();
model.addAttribute("mealsCreate", meal);
return "createmealForm";
}
@PostMapping(value = "/create")
public String save(@ModelAttribute("mealsCreate") Meal meal) {
mealService.save(meal);
return "redirect:/list";
}
@GetMapping(value = "/delete")
public String deleteMeal(@RequestParam("mealId") int id) {
mealService.delete(id);
return "redirect:/list";
}
@GetMapping(value = "/updateForm")
public String updateForm(@RequestParam("mealId") int id, Model model) {
Meal meal = mealService.get(id);
model.addAttribute("mealsUpdate", meal);
return "updatemealForm";
}
@PostMapping(value = "/update")
public String update(@ModelAttribute("mealsUpdate") Meal meal) {
mealService.update(meal);
return "redirect:/list";
}
}