I want to configure on xml JdbcTemolate.
it looks like this
<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>
but I get such an error
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jdbcMealServiceImpl': Unsatisfied dependency expressed through field 'jdbcMealRepository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'ru.demo.exercise.repository.jdbc.JdbcMealRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:639) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:116) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:397) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1429) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1287) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1207) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:636) ... 61 common frames omitted Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'ru.demo.exercise.repository.jdbc.JdbcMealRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1695) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1253) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1207) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:636) ... 74 common frames omitted
This is my 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);
}
}
JdbcRepository:
@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:
@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";
}
}