JdbcTemlate - нет подходящего бина типа - PullRequest
0 голосов
/ 25 марта 2020

Я хочу настроить на 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";
    }
}

1 Ответ

0 голосов
/ 25 марта 2020

JdbcMealRepository не должен быть абстрактным классом. Мы должны предоставить конкретный класс реализации. Попробуйте удалить абстрактное ключевое слово из класса JdbcMealRepository.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...