【问题标题】:JdbcTemlate - No qualifying bean of type availableJdbcTemplate - 没有可用类型的限定 bean
【发布时间】:2020-07-05 19:54:35
【问题描述】:

我想在 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”的 bean 时出错:不满意 通过字段“jdbcMealRepository”表示的依赖关系;嵌套的 例外是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 符合条件的 bean 类型 'ru.demo.exercise.repository.jdbc.JdbcMealRepository' 可用: 预计至少有 1 个 bean 有资格作为 autowire 候选者。 依赖注解: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:639) 在 org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:116) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:397) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1429) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) 在 org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) 在 org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1287) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1207) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:636) ...省略了61个常见框架原因: org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 符合条件的 bean 类型 'ru.demo.exercise.repository.jdbc.JdbcMealRepository' 可用: 预计至少有 1 个 bean 有资格作为 autowire 候选者。 依赖注解: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1695) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1253) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1207) 在 org.springframework.beans.factory.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);
    }
}

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
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";
    }
}

【问题讨论】:

    标签: java xml spring jsp


    【解决方案1】:

    JdbcMealRepository 不应是抽象类。我们必须提供一个具体的实现类。尝试从 JdbcMealRepository 类中删除 abstract 关键字。

    【讨论】:

      猜你喜欢
      • 2016-11-30
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 2015-12-24
      • 2017-08-23
      • 1970-01-01
      相关资源
      最近更新 更多