Ошибка при создании компонента с именем «ActivityController»

#spring #service #controller #dao #dto

Вопрос:

У меня возникла эта проблема во время работы на сервере (Tomcat) моего проекта. Я создал проект Maven с использованием Spring. Версия Java-Java 1.8. НИКАКОЙ ВЕСЕННЕЙ ЗАГРУЗКИ!

 Error creating bean with name 'activityController': Unsatisfied dependency expressed through field 'activityService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'activityService': Unsatisfied dependency expressed through field 'dao'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.calendar.repository.ActivityDAO' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
 

Не могли бы вы, пожалуйста, помочь мне? Спасибо!

Это и есть код. Спасибо!!!

pom.xml:

     <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.calendar</groupId>
    <artifactId>calendar</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>Calendar</name>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <springframework.version>5.1.4.RELEASE</springframework.version>
        <jackson.version>2.11.2</jackson.version>
        <email.version>1.6.2</email.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>2.4.7</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.1.Final</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.0</version>
        </dependency>
    </dependencies>

    <repositories>
    </repositories>

    <build>
        <finalName>company-calendar</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
 

Activity.java

 package com.calendar.entity;

import java.io.Serializable;
import javax.persistence.*;
import java.sql.Timestamp;
import java.util.List;

/**
 * The persistent class for the activity database table.
 *
 */
@Entity
@NamedQuery(name = "Activity.findAll", query = "SELECT a FROM Activity a")
public class Activity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    private Integer id;

    @Column(name = "create_time")
    private Timestamp createTime;

    @Column(name = "created_by")
    private String createdBy;

    private String description;

    @Column(name = "update_time")
    private Timestamp updateTime;

    @Column(name = "updated_by")
    private String updatedBy;

    //bi-directional many-to-one association to CalendarHeader
    @OneToMany(mappedBy = "activity")
    private List<CalendarHeader> calendarHeaders;

    public Activity() {
    }

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Timestamp getCreateTime() {
        return this.createTime;
    }

    public void setCreateTime(Timestamp createTime) {
        this.createTime = createTime;
    }

    public String getCreatedBy() {
        return this.createdBy;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    public String getDescription() {
        return this.description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Timestamp getUpdateTime() {
        return this.updateTime;
    }

    public void setUpdateTime(Timestamp updateTime) {
        this.updateTime = updateTime;
    }

    public String getUpdatedBy() {
        return this.updatedBy;
    }

    public void setUpdatedBy(String updatedBy) {
        this.updatedBy = updatedBy;
    }

    public List<CalendarHeader> getCalendarHeaders() {
        return this.calendarHeaders;
    }

    public void setCalendarHeaders(List<CalendarHeader> calendarHeaders) {
        this.calendarHeaders = calendarHeaders;
    }

    public CalendarHeader addCalendarHeader(CalendarHeader calendarHeader) {
        getCalendarHeaders().add(calendarHeader);
        calendarHeader.setActivity(this);

        return calendarHeader;
    }

    public CalendarHeader removeCalendarHeader(CalendarHeader calendarHeader) {
        getCalendarHeaders().remove(calendarHeader);
        calendarHeader.setActivity(null);

        return calendarHeader;
    }

}
 

ActivityDAO.java

     package com.calendar.repository;
    
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.stereotype.Repository;
    
    import com.calendar.entity.Activity;
    
    
    @Repository
    public interface ActivityDAO extends JpaRepository<Activity, Integer> {}


**ActivityDTO.java**

package com.calendar.dto;

import java.sql.Timestamp;

public class ActivityDTO {

    private Integer id;

    private String description;
    
    private Timestamp createTime;

    private String createdBy;
    
    private Timestamp updateTime;

    private String updatedBy;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Timestamp getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Timestamp createTime) {
        this.createTime = createTime;
    }

    public String getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    public Timestamp getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Timestamp updateTime) {
        this.updateTime = updateTime;
    }

    public String getUpdatedBy() {
        return updatedBy;
    }

    public void setUpdatedBy(String updatedBy) {
        this.updatedBy = updatedBy;
    }
    
    

}
 

ActivityService.java

 package com.calendar.service;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.calendar.dto.ActivityDTO;
import com.calendar.repository.ActivityDAO;
import com.calendar.entity.Activity;

@Service
public class ActivityService {
    
    @Autowired
    ActivityDAO dao;
    
    public List<ActivityDTO> findAll() {
        List<ActivityDTO> DTOList = new ArrayList<ActivityDTO>();
        List<Activity> entity = dao.findAll();
        if (entity != null) {
            for (Activity e : entity) {
                DTOList.add(getDTOFromEntity(e));
            }
        }
        return DTOList;
    };

        
    
    protected ActivityDTO getDTOFromEntity(Activity entity) {
        ActivityDTO activityDTO = new ActivityDTO();
        
        activityDTO.setId(entity.getId());
        activityDTO.setDescription(entity.getDescription());
        activityDTO.setCreatedBy(entity.getCreatedBy());
        activityDTO.setCreateTime(entity.getCreateTime());
        activityDTO.setUpdatedBy(entity.getUpdatedBy());
        activityDTO.setUpdateTime(entity.getUpdateTime());
        
        return activityDTO;
    }

}
 

ActivityController.java

 package com.calendar.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.calendar.dto.ActivityDTO;
import com.calendar.service.ActivityService;

@RestController
@RequestMapping("activity")
public class ActivityController {
    
    
    @Autowired
    private ActivityService activityService;
    
    private ActivityService getService() {
        System.out.println("service= "   activityService);
        return activityService;
    }
    
    @Transactional(readOnly = true)
    @GetMapping("")
    @ResponseBody
    public List<ActivityDTO> findAll() {
        System.out.println("SIL findAll");
        return getService().findAll();
    }

}
 

AppConfig.java

 package com.calendar.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.jpa.LocalEntityManagerFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebMvc
@EnableTransactionManagement
@ComponentScan(basePackages = "com.calendar")
public class AppConfig implements WebMvcConfigurer {

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        //to see html files
        configurer.enable();
    }

    //Entity manager
    @Bean(name = "Calendar_PU")
    public LocalEntityManagerFactoryBean getEntityManagerFactoryBean() {
        LocalEntityManagerFactoryBean factoryBean = new LocalEntityManagerFactoryBean();
        factoryBean.setPersistenceUnitName("Calendar_PU");
        return factoryBean;
    }
}
 

С уважением,
Франческо

Комментарии:

1. Вы используете Пружинный ботинок? Если да, не могли бы вы, пожалуйста, поделиться своим основным занятием? Спасибо.

2. Нет, я не использую Пружинный ботинок. У меня есть «AppConfig.java», это я добавлю сейчас

Ответ №1:

Попробуйте добавить @EnableJpaRepositories в свой AppConfig :

 @Configuration
@EnableWebMvc
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.calendar.repository")
@ComponentScan(basePackages = "com.calendar")
public class AppConfig implements WebMvcConfigurer {

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        //to see html files
        configurer.enable();
    }

    //Entity manager
    @Bean(name = "Calendar_PU")
    public LocalEntityManagerFactoryBean getEntityManagerFactoryBean() {
        LocalEntityManagerFactoryBean factoryBean = new LocalEntityManagerFactoryBean();
        factoryBean.setPersistenceUnitName("Calendar_PU");
        return factoryBean;
    }
}
 

Вам также нужно изменить свой pom.xml . Существует слишком много зависимостей (большинство из них уже являются частью spring-data-jpa ), и spring-data-jpa для этого требуется весна 5.3.5 .

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.calendar</groupId>
<artifactId>calendar</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>

<name>Calendar</name>

<properties>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <springframework.version>5.3.5</springframework.version>
    <jackson.version>2.11.2</jackson.version>
    <email.version>1.6.2</email.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${springframework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>2.4.7</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.0</version>
    </dependency>
</dependencies>

<repositories>
</repositories>

<build>
    <finalName>company-calendar</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
    </plugins>
</build>
</project>
 

Вот почему вам следует рассмотреть возможность использования Spring Boot. Вы избежите проблем с зависимостями, которые не работают вместе.

Комментарии:

1. теперь у меня есть еще одна ошибка: Servlet.init() для сервлета [SpringDispatcher] выдал исключение java.lang. NoSuchFieldError: ГЕНЕРАТОР ИМЕН IMPORT_BEAN_NAME_GENERATOR

2. Проверьте мой ответ, я его отредактировал 😉